【问题标题】:Google App Engine Python: Accessing the database object in another classGoogle App Engine Python:访问另一个类中的数据库对象
【发布时间】:2014-02-08 17:38:38
【问题描述】:

我将直接深入研究我正在使用 Python 中的 Google App Engine 开发的应用程序的代码:

import os
import webapp2
import jinja2
from google.appengine.ext import db

template_dir = os.path.join(os.path.dirname(__file__), 'templates')
jinja_env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir), autoescape=True)

class Handler(webapp2.RequestHandler):
    def write(self, *a, **kw):
        self.response.out.write(*a, **kw)
    def render_str(self, template, **params):
        t = jinja_env.get_template(template)
        return t.render(params)
    def render(self, template, **kw):
        self.write(self.render_str(template, **kw))

class Users(db.Model):
    name = db.StringProperty(required = True)
    password = db.StringProperty(required = True)
    email = db.EmailProperty(required = True)
    address = db.PostalAddressProperty(required = True)
    join_date = db.DateTimeProperty(auto_now_add = True)
    dob = db.DateTimeProperty()
    phone = db.PhoneNumberProperty()    

class Orders(db.Model):
    name = db.StringProperty(required = True)
    email = db.EmailProperty(required = True)
    address = db.PostalAddressProperty(required = True)

class MainPage(Handler):
    def get(self):
        self.render("home.html")

class Register(Handler):
    def get(self):
        self.render("signup-form.html")
    def post(self):
        name = self.request.get("username")
        password = self.request.get("password")
        verify = self.request.get("verify")
        email = self.request.get("email")
        address = self.request.get("address")
        phone = self.request.get("phone")

        a = Users(name = name, password = password, email = email, address = address, phone = phone)
        a.put()
        self.response.write("Registration successful!")

class MP(Handler):
    def get(self):
        self.render("mp.html")
    def post(self):
        self.render("order2.html")

class Order2Login(Handler, Register):
    def get(self):
        self.render("orderlogin.html")
    def post(self):
        old_usr = self.request.get("loginname")
        old_pwd = self.request.get("loginpwd")
        ans = a.filter("name =", old_usr).filter("password =", old_pwd)
        if ans:
            self.response.write("You are a registered member!")
        else:
            self.response.write("You are NOT registered.")

class Order2New(Handler):
    def get(self):
        self.response.write("New user yeah")        

app = webapp2.WSGIApplication([('/', MainPage),
                                ('/register', Register),
                                ('/mp', MP),
                                ('/order2new', Order2New),
                                ('/order2login', Order2Login)], debug=True)

现在,在 Order2Login 类中,我需要访问数据库对象“a”,以便确认用户是否已经是我网站的成员。现在,为此,我在 Order2Login 类中继承了 Register 类,因为“a”对象最初是在 Register 类中创建的。

但是,在我的本地机器上运行我的应用程序后,我收到以下错误:

TypeError: Error when calling the metaclass bases

    Cannot create a consistent method resolution

order (MRO) for bases Handler, Register

我的代码中似乎有什么问题?

【问题讨论】:

    标签: python google-app-engine multiple-inheritance gql


    【解决方案1】:

    这样的继承根本没有任何意义。即使除了元类问题,继承也不会使该变量可用,因为它是一个局部变量。无论如何,这是两个完全独立的请求,因此数据不会在它们之间持续存在。

    但我不知道为什么您认为无论如何都需要访问该变量。 User 对象被持久化到数据存储区:在登录视图中,您不想查询 a,它是单个实例并且无论如何都没有 filter 方法,您想查询 User 类。

    【讨论】:

    • 但是如何在不使用 filter() 方法的情况下从用户数据库中过滤掉某些属性?我不能使用像 Users.filter() 这样的东西。从创建它的类之外的数据库中提取数据的另一种方法是什么?
    • 可以使用过滤方法。更准确地说,你使用Users.all().filter
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2015-07-11
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多