Python 将变量赋给'g'一次且仅赋一次,以便在烧瓶中应用
我想保存一个对象,它是一个昂贵函数的结果。 昂贵的函数在任何请求之前只能处理一次 我查看了Flask的文档,并考虑了Python 将变量赋给'g'一次且仅赋一次,以便在烧瓶中应用,python,web,flask,Python,Web,Flask,我想保存一个对象,它是一个昂贵函数的结果。 昂贵的函数在任何请求之前只能处理一次 我查看了Flask的文档,并考虑了g以保存结果和@app。在第一次请求之前,装饰者定义此分配只发生了一次 我的代码如下: @app.before_first_request def before_first_request(): g.rec = take_long_time_to_do() @app.route('/test/') def test(): return render_templat
g
以保存结果和@app。在第一次请求之前,
装饰者定义此分配只发生了一次
我的代码如下:
@app.before_first_request
def before_first_request():
g.rec = take_long_time_to_do()
@app.route('/test/')
def test():
return render_template('index.html',var_rec=g.rec)
但是,这些代码不会很好地工作。它仅在第一次调用test
请求时起作用。当我第二次访问“myapplication/test”时,g.rec
不存在,这将引发异常
在初始化应用程序时,是否有人知道如何将全局变量分配到
g
中?g
仅是该请求的全局对象。您是否考虑过使用缓存机制
> pip search flask | grep "cache" | sort
Flask-Cache - Adds cache support to your Flask application
Flask-Cache-PyLibMC - PyLibMC cache for Flask-Cache, supports multiple operations
Flask-Memsessions - A simple extension to drop in memcached session support for Flask.
然后,您可以将
take_long_time_to_do()
的结果存储在那里,并在它存在时检索它。您可以尝试将该函数调用放入项目包的\u init\u.py
中吗?我通常使用\uuuu init\uuuuuuuuuuuupy
初始化app=Flask(\uuuuu name\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
# __init__.py:
from flask import Flask
from somemodule import take_long_time_to_do
app = Flask(__name__)
rec = take_long_time_to_do()
然后,您可以在任何视图中使用rec
变量,只要您导入它:
# views.py
from myproject import rec
@app.route('/test/')
def test():
return render_template('index.html',var_rec=rec)
缓存通常是这样做的。但假设您有一个一次性的值,并且由于某种原因不想引入缓存基础设施(值不会超时),您也可以在应用程序启动时将其作为全局模块进行计算,使用它,和/或在需要时导入它
如果模板中需要该值:
- 通过将其添加到模板
- 在应用程序初始化之前将其添加到配置模块
谢谢你,斯贝里。我可以在该应用程序中使用全局不可变对象吗?为什么我应该使用捕捉
而不是全局对象?同意-功能非常强大,您可以缓存到内存/文件/redis并设置超时等。查看example@Firegun:否。没有可用于所有请求的全局对象。这就是缓存的目的。@sberry你说的“没有全局对象可用于所有请求”是什么意思?我可以在app=Flask(\uu name\uuu)
之后分配一个全局对象,例如rec=100
,然后我可以在任何查看器函数中使用此变量rec
。我不能吗?