我是 python 的新手,我正在尝试从 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
import models
class showPhoneBook(db.Model):
username = db.StringProperty(required=True)
class MyHandler(webapp.RequestHandler):
user_name = ''
def get(self):
p = db.GqlQuery('SELECT * FROM UserDetails WHERE user_name = $1', user_name)
#p = UserDetails.gql('WHERE user_name = $1', user_name)
result1 = p.fetch(1)
for itr1 in result1:
userId = itr.user_id
q = db.GqlQuery('SELECT * FROM PhoneBook WHERE user_id = :1', userId)
#q = PhoneBook.gql('WHERE user_id = :1', userId)
values = {
'phoneBookValues': q
}
self.request.out.write(
template.render('phonebook.html', values))
def post(self):
global user_name
phoneBookuserID = showPhoneBook(
user_name = self.request.get(
'username'))
self.request.out.write(user_name)
phonebookuserID.put()
self.redirect('/')
def main():
app = webapp.WSGIApplication([
(r'.*',MyHandler)], debug=True)
wsgiref.handlers.CGIHandler().run(app)
if __name__ == "__main__":
main()
这里的 UserDetails 和 Phonebook 是我在 models.py
中定义的实体类请帮助我找出错误...或者可能在从 UI 获取 user_name 后获得如何在查询中使用它的更正代码。
最佳答案
首先,App Engine 的执行模型非常“松散”——这就是它具有如此可扩展性的原因!当对您的 URL 的请求到达时,GAE 可能会重用已经在运行您的脚本的现有进程,或者它可能会启动另一个运行相同脚本的进程(如果这样可以更好地平衡整个系统负载);一旦请求得到服务,服务它的进程可能会保留或不存在,这取决于系统是否有更好的事情来处理进程占用的内存。
因此,您必须以在任何一种情况下都能正常工作的方式进行编码,而不是假设该过程会在请求之间停留(也不要假设它不会)。所以全局变量(在所有类型的编程中最总是最好避免的)绝对不是要走的路!
在请求之间持久化事物的唯一保证方法是将它们存储在数据库中;在您的响应中将 cookie 作为 header 发送到用户的浏览器,因此浏览器将在下一个请求时将其发回,也可能没问题(用户可能决定阻止他的浏览器接受和重新发送 cookie,但这就是用户的决定,您实际上无能为力)。
“ session ”的抽象概念可以封装这些选择并让您在更高级别进行编程,许多框架都提供某种 session ,例如参见 gaeutilities除非您已经在使用其他提供 session 抽象的 Web 框架。
您的代码还有许多其他具体问题(例如 username
和 user_name
之间的混淆,全局变量和类变量之间的混淆,以及缺少对要么!),但在某种意义上,与在应用程序引擎中使用全局变量的整个概念问题相比,这些都是次要问题!-)
关于python - 在 python/GAE 中声明全局变量的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1621259/