0

我对 python 很陌生,在简要介绍了 python + Google 应用引擎之后,我开始着手一个试点项目。我已将 2 个实体 UserDetails 和 PhoneBook 与数据批量加载到应用程序引擎上。现在在我的 UI 中,我尝试首先输入用户名,然后查询它以从 UserDetails 中获取用户 ID,然后使用检索到的用户 ID 查询电话簿以获取他的电话簿条目。这是我的 UI 代码,

#!/usr/bin/env python

import wsgiref.handlers
from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from models import UserDetails,PhoneBook
#import models

class showPhoneBook(db.Model):
    """ class to store the user_name to db """
    user_name = db.StringProperty(required=True)

class MyHandler(webapp.RequestHandler):
    def get(self):
        """ Query type 1 """
        #p = db.GqlQuery('SELECT * FROM UserDetails WHERE user_name = :1', user_name)

        """ Query type 2 """
        #p = UserDetails.gql('WHERE user_name = :1', user_name)

        """ Query type 3 """
        p = UserDetails.all().filter('user_name = ', user_name)
        result1 = p.get()
        for itr1 in result1:
            userId = itr.user_id

        """ Query type 1 """    
        #q = db.GqlQuery('SELECT * FROM PhoneBook WHERE user_id = :1', userId)

        """ Query type 2 """
        #q = PhoneBook.gql('WHERE user_id = :1', userId)

        """ Query type 3 """
        q = PhoneBook.all().filter('user_id = ', userId)
        values = {
            'phoneBookValues': q
        }
        self.response.out.write(
            template.render('phonebook.html', values))
    def post(self):
        phoneBookuserID = showPhoneBook(
            user_name = self.request.get('username'))
        phonebookuserID.put()
        self.redirect('/')

def main():
    app = webapp.WSGIApplication([
        (r'.*',MyHandler)], debug=True)
    wsgiref.handlers.CGIHandler().run(app)

if __name__ == "__main__":
    main()

问题是我在日志中收到此错误,即 GAE 无法从模型中导入 UserDetails/phone 类,

<type 'exceptions.ImportError'>: cannot import name UserDetails
Traceback (most recent call last):
  File "/base/data/home/apps/bulkloader160by2/1-4.337299749289926105/main.py", line 7, in <module>
    from models import UserDetails,PhoneBook

当我删除from models import UserDetails,PhoneBook并使用时import models,我得到,

global name 'UserDetails' is not defined
Traceback (most recent call last):
  File "/base/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 507, in __call__
    handler.get(*groups)
  File "/base/data/home/apps/bulkloader160by2/1-4.337300095868541686/main.py", line 19, in get
    p = UserDetails.all().filter('user_name = ', user_name)
NameError: global name 'UserDetails' is not defined

这是我的 models.py 文件,我在其中定义了 UserDetails 和 PhoneBook 类。我已将此文件存储在根目录中。

#!/usr/bin/env python

from google.appengine.ext import db

#Table structure of User Details table
class UserDetails(db.Model):
  user_id = db.IntegerProperty(required = True)
  user_name = db.StringProperty(required = True)
  mobile_number = db.PhoneNumberProperty(required = True)

#Table structure of Phone Book table
class PhoneBook(db.Model):
  contact_id = db.IntegerProperty(required=True)
  user_id = db.IntegerProperty(required=True)
  contact_name = db.StringProperty(required=True)
  contact_number = db.PhoneNumberProperty(required=True)

作为 python 新手,我无法弄清楚为什么无法从我的 models.py 文件中导入我的类,以及如何从 to 设置/获取post(self)user_name get(self)

如果我很天真,请原谅我,但如果您能帮助我正确设置我的代码,我们将非常感谢您的帮助。

谢谢。

4

2 回答 2

1

当它可以很好地导入模块('models'),但在其中找不到成员('UserDetails')时,会出现第一个错误。如果您输入了错误的类名称,或者没有在该模块中定义它,通常会出现这种情况。

预计会出现第二个错误,因为您正在导入“models”模块,但随后尝试通过其非限定名称来引用 UserDetails - 如果仅导入模块,则需要将其称为“models.UserDetails”。

但是,根据您提供的代码,我看不出有什么问题,这让我相信这是您为粘贴的代码片段所做的更改。仔细检查您的 models.py 文件中是否正确定义了 UserDetails。您可能还想尝试以下方法:

import models
logging.warn(models.__file__)

这将向您显示模型模块的路径,这将让您验证在某处不存在您意外导入的同名模块。

于 2009-10-26T13:30:13.473 回答
0

如果 models.py 位于子目录中,您可能需要将其添加到系统路径中,例如:

sys.path.append(os.path.join(os.path.dirname(__file__), "lib"))

如果模型是目录并且类在 UserDetails.py 等中,您可能需要:

sys.path.append(os.path.join(os.path.dirname(__file__), "models"))
import UserDetails
于 2009-10-26T23:11:21.090 回答