我是python的新手,在简要介绍python + Google app引擎之后,我开始研究一个试点项目了。我已将2个实体UserDetails和PhoneBook与数据一起批量加载到应用引擎上。现在在我的UI中,我尝试首先接受用户名,然后查询它以从UserDetails获取用户ID,然后使用检索到的用户ID我查询PhoneBook以获取他的电话簿条目。这是我的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文件中导入我的类以及如何设置/获取user post(self)
到get(self)
。< / p>
请原谅我,如果我天真,但如果你能帮我设置正确的代码,我们非常感谢你的帮助。
感谢。
答案 0 :(得分:1)
当它可以导入模块('models')时会出现第一个错误,但是找不到该成员('UserDetails')。如果您错误输入了类的名称,或者没有在该模块中定义它,通常会出现这种情况。
预计会出现第二个错误,因为您正在导入'models'模块,但之后尝试通过其非限定名称引用UserDetails - 如果仅导入模块,则需要将其称为'models.UserDetails'
根据您提供的代码,我看不出任何错误,这让我相信您已经为您粘贴的代码段改变了一些内容。仔细检查在models.py文件中是否正确定义了UserDetails。您可能还想尝试以下操作:
import models
logging.warn(models.__file__)
这将显示模型模块的路径,它将让您验证在您意外导入的某个地方没有其他模块。
答案 1 :(得分: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