我是python的新手。我无法从实体中查询 - UserDetails和PhoneBook我加载到app引擎数据存储区。我在下面根据Brett关于“在GAE上开发和部署应用程序”的youtube视频编写了这个UI - shoutout应用程序。好吧,我只是尝试进行一些逆向工程来从数据存储区查询,但每一步都失败了。
#!/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
import models
class showPhoneBook(db.Model):
""" property to store user_name from UI to persist for the session """
user_name = db.StringProperty(required=True)
class MyHandler(webapp.RequestHandler):
def get(self):
## Query to get the user_id using user_name retrieved from UI ##
p = UserDetails.all().filter('user_name = ', user_name)
result1 = p.get()
for itr1 in result1:
userId = itr.user_id
## Query to get the phone book contacts using user_id retrieved ##
q = PhoneBook.all().filter('user_id = ', userId)
values = {
'phoneBookValues': q
}
self.request.out.write(
template.render('phonebook.html', values))
def post(self):
phoneBookuser = showPhoneBook(
user_name = self.request.get('username'))
phoneBookuser.put()
self.redirect('/')
def main():
app = webapp.WSGIApplication([
(r'.*',MyHandler)], debug=True)
wsgiref.handlers.CGIHandler().run(app)
if __name__ == "__main__":
main()
这是我的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)
以下是我面临的问题,
1)我无法在get(self)方法中调用user_name
(从UI-- phoneBookuser = showPhoneBook(user_name = self.request.get('username'))
检索),以查询UserDetails以获取相应的user_name
。
2)从models.py文件导入时,代码无法识别UserDetails和PhoneBook类
3)我试图在main.py文件本身中定义UserDetails和PhoneBook类,我在result1 = p.get()
得到错误BadValueError: Unsupported type for property : <class 'google.appengine.ext.db.PropertiedClass'>
自从2周以来,我一直在努力克服陷入困境但却徒劳无功。请帮我理清我的代码('因为我觉得我写的是一个容易出错的代码)。
答案 0 :(得分:3)
我建议您阅读GAE找到的here的Python文档。
一些意见:
要使用models.py
中的模型,您需要使用前缀models.
(例如models.UserDetails
)或使用
来自模型导入*
MyHandler.get()
中您没有查找username
获取参数
要获取与查询相对应的值,请执行p.fetch(1)
而非p.get()
您还应该阅读Reference properties in GAE。我建议您将模型设为:
class UserDetails(db.Model):
user_name = db.StringProperty(required = True)
mobile_number = db.PhoneNumberProperty(required = True)
#Table structure of Phone Book table
class PhoneBook(db.Model):
user = db.ReferenceProperty(UserDetails)
contact_name = db.StringProperty(required=True)
contact_number = db.PhoneNumberProperty(required=True)
然后您的MyHandler.get()
代码将如下所示:
def get(self):
## Query to get the user_id using user_name retrieved from UI ##
user_name = self.request.get('username')
p = UserDetails.all().filter('user_name = ', user_name)
user = p.fetch(1)[0]
values = {
'phoneBookValues': user.phonebook_set
}
self.response.out.write(template.render('phonebook.html', values))
(不用说,你需要处理在数据库中找不到用户名的情况)
我不太明白showPhoneBook
模型的观点。
答案 1 :(得分:1)
存储到数据存储区的“会话变量”不会遵循您的重定向;你必须从你的get()处理程序中的数据存储区中获取它,尽管没有在cookie中设置会话ID或者根本不会实现会话,而是允许任何人获得/使用任何值发送POST请求是否是由他们或其他人发送的。为什么要使用重定向;响应POST请求应该在post()方法中完成,而不是通过重定向到GET方法。