在GAE中导入模型文件中的类时出现问题

0 投票
2 回答
1512 浏览
提问于 2025-04-15 15:22

我刚接触Python,最近学习了一些关于Python和Google App Engine的知识,现在开始做一个试点项目。我已经把两个实体UserDetails和PhoneBook的数据批量上传到应用引擎上。现在在我的用户界面中,我首先想输入用户名,然后查询UserDetails来获取用户ID,再用这个用户ID去查询PhoneBook,获取他的电话簿条目。以下是我用户界面的代码:

#!/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和PhoneBook类。

<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文件中导入我的类,以及如何在post(self)get(self)之间设置或获取用户名。

如果我说得不对,请多多包涵,但如果你能帮我解决这个问题,我会非常感激。

谢谢!

2 个回答

0

如果你的models.py文件在一个子文件夹里,你可能需要把这个文件夹添加到系统路径中,比如:

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

如果models是这个文件夹的名字,而里面的类在UserDetails.py等文件里,你可能需要这样做:

sys.path.append(os.path.join(os.path.dirname(__file__), "models"))
import UserDetails
1

你遇到的第一个错误是因为程序能顺利导入模块('models'),但找不到里面的成员('UserDetails')。这种情况通常是因为你写错了类的名字,或者这个模块里根本没有定义这个类。

第二个错误是可以预料的,因为你导入了'models'模块,但又试图用简单的名字来引用UserDetails。如果你只导入了模块,就需要用'models.UserDetails'来引用它。

不过,根据你提供的代码,我看不出有什么问题,这让我觉得可能是你在粘贴代码片段时做了什么修改。请仔细检查一下UserDetails在你的models.py文件中是否正确定义。你也可以尝试以下操作:

import models
logging.warn(models.__file__)

这会显示出models模块的路径,让你确认一下是不是不小心导入了其他同名的模块。

撰写回答