python - 在 python/GAE 中声明全局变量的问题

标签 python google-app-engine

我是 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()

这里的 UserDetailsPhonebook 是我在 models.py

中定义的实体类

请帮助我找出错误...或者可能在从 UI 获取 user_name 后获得如何在查询中使用它的更正代码。

最佳答案

首先,App Engine 的执行模型非常“松散”——这就是它具有如此可扩展性的原因!当对您的 URL 的请求到达时,GAE 可能会重用已经在运行您的脚本的现有进程,或者它可能会启动另一个运行相同脚本的进程(如果这样可以更好地平衡整个系统负载);一旦请求得到服务,服务它的进程可能会保留或不存在,这取决于系统是否有更好的事情来处理进程占用的内存。

因此,您必须以在任何一种情况下都能正常工作的方式进行编码,而不是假设该过程会在请求之间停留(也不要假设它不会)。所以全局变量(在所有类型的编程中最总是最好避免的)绝对不是要走的路!

在请求之间持久化事物的唯一保证方法是将它们存储在数据库中;在您的响应中将 cookie 作为 header 发送到用户的浏览器,因此浏览器将在下一个请求时将其发回,也可能没问题(用户可能决定阻止他的浏览器接受和重新发送 cookie,但这就是用户的决定,您实际上无能为力)。

“ session ”的抽象概念可以封装这些选择并让您在更高级别进行编程,许多框架都提供某种 session ,例如参见 gaeutilities除非您已经在使用其他提供 session 抽象的 Web 框架。

您的代码还有许多其他具体问题(例如 usernameuser_name 之间的混淆,全局变量和类变量之间的混淆,以及缺少对要么!),但在某种意义上,与在应用程序引擎中使用全局变量的整个概念问题相比,这些都是次要问题!-)

关于python - 在 python/GAE 中声明全局变量的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1621259/

相关文章:

python - 如何根据另一个 torch 张量中的索引更改 torch 张量中的某些值?

python - 如何在 PIL 中使用 unicode 字符?

python - Pyspark 数据框将多列转换为 float

google-app-engine - 如何使用 Google App Engine NDB 获得字段的最大值

sockets - 是否存在 appengine 数据存储命名空间和套接字连接关系

google-app-engine - 将结构 slice 转换为空接口(interface) slice

javascript - 合金钛和谷歌云端点

python - 在没有开始标签的情况下如何从汤中提取数据?

python - 检测用户正在查看哪个立方体?

python - 如何使用 Pandas 获取包含的每个组合的计数