繁体   English   中英

在python / GAE中声明全局变量时出现问题

[英]Problem declaring global variable in python/GAE

我是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可能会重用已经在运行您的脚本的现有进程, 或者如果可以更好地平衡整个系统负载,则它可能会启动另一个运行同一脚本的进程。 一旦满足了请求,则根据系统是否与该进程所占用的内存有更好的关系,处理该请求的进程可能会一直存在或不存在。

因此,必须在这两种情况下,(无论是和而不承担也不会 )的作品而不承担这一进程将坚持请求之间围绕路码。 因此,全局变量(在各种编程中通常最好避免使用) 绝对不是要走的路!

在请求之间持久化事务的唯一保证方法是将它们存储在db中。 将Cookie作为响应中的标头发送到用户的浏览器,因此该浏览器会在下一个请求时将其发送回去,这也可能没问题(用户可能决定阻止其浏览器接受和重新发送Cookie,但这就是用户的决定,那么您就不能做太多事情了。

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

您的代码还有很多其他特定的问题(例如, usernameuser_name之间的混淆,全局变量和类变量之间的混淆以及对这两个变量的任何赋值都没有!),但从某种意义上说,与整个概念相比,这些都是较小的问题在应用程序引擎中使用全局变量的问题!-)

亚伦·汉普顿(Aaron Hampton)的回答是在python中通过重定向将变量传递给模板

看起来它可能对您有用,并且还避免了其他人提到的全局变量的陷阱。

简单!

您似乎将user_name存储为类变量,而不是全局变量。 这里有一些棘手的行为,方法中对它的引用将创建一个名称相同的实例变量,该实例变量将隐藏类变量。

class curious(object):
  hide = 11
  def get(self):
    return self.hide
  def put(self,x):
    print "before",self.hide
    self.hide = x
    print "after", self.hide

a = curious()
b = curious()
print a.hide,b.hide
a.put(23)
print a.hide,b.hide

请注意,即使在a中更改了对象b,它仍然如何引用值11。

不要那样做 通过在模块级别的任何类定义之外分配默认值,使其成为真实的全局变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM