Google App Engine Python:访问另一个类中的数据库对象

时间:2014-02-08 17:38:39

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

我将直接深入研究我在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

我的代码中出现了什么问题?

1 个答案:

答案 0 :(得分:2)

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

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