Skip to main content
 首页 » 编程设计

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

2025年05月04日14开发

我是 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 之间的混淆,全局变量和类变量之间的混淆,以及缺少对要么!),但在某种意义上,与在应用程序引擎中使用全局变量的整个概念问题相比,这些都是次要问题!-)