我需要定义我自己的变量,这些变量将在服务器运行时保存在服务器上。我试图使用flask.g
,但它抛出一个错误:
AttributeError: '_AppCtxGlobals' object has no attribute 'x'
代码如下:
from flask import *
app=Flask(__name__)
@app.route('/')
def opa():
#Added this to define variable
try:
g.x
except NameError:
g.x=None
#Added this to add value to variable
if g.x is None:
g.x='Already defined'
return 'x is now defined'
else:
return g.x
if __name__ == "__main__":
app.run(host='0.0.0.0',port=8081,debug=True)
访问属性会抛出AttributeError
,而不是NameError
:
try:
g.x
except AttributeError:
g.x = None
您最好在这里使用in
的成员性测试:
if 'x' not in g:
g.x = 'Already defined'
return 'x is now defined'
else:
return g.x
我链接给你的文档也提供了使用g.get()
和getattr()
作为替代方案:
x = g.get('x', None)
# x = getattr(g, 'x', None)
if x is None:
g.x = 'Already defined'
return 'x is now defined'
else:
return x
请注意,g
全局上下文仍然与请求相关联;您不能在其上存储从一个请求持续到另一个请求的全局变量。g
支持在应用程序的不同函数和模板之间共享数据,而不是在请求之间共享数据。
使用实际的全局变量(最好通过app.before_first_request()
钩子设置),或者使用某种形式的缓存(如Flask-Cache)。
设置全应用全局:
x = None
@app.before_first_request
def set_x():
global x
x = 'x is now defined'
通过使用before_first_request
,可以确保在应用程序启动时只设置一次x
,即使您使用的服务器使用多个进程来处理请求。
或者使用缓存:
from flask.ext.cache import Cache
cache = Cache(app)
@cache.memoize(timeout=3600) # cache for one hour
def produce_x():
return 'x is now defined'
则需要定义x
时使用produce_x()
;当计算x
很昂贵,但必须不时重新计算时,这很有帮助。
更简单的方法是这样做:
x = getattr(flask.g, 'x', None)
if x is None:
g.x = 'Already defined'
return 'x is now defined'
else:
return g.x
或者,您可以看到您的代码抛出AttributeError
。因此,如果你想保留你的try/catch代码,那么你需要专门捕获AttributeError
而不是TypeError
。
try:
g.x
except AttributeError:
g.x=None
if g.x is None:
g.x='Already defined'
return 'x is now defined'
else:
return g.x