Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将变量赋给'g'一次且仅赋一次,以便在烧瓶中应用_Python_Web_Flask - Fatal编程技术网

Python 将变量赋给'g'一次且仅赋一次,以便在烧瓶中应用

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

我想保存一个对象,它是一个昂贵函数的结果。 昂贵的函数在任何请求之前只能处理一次

我查看了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_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
。我不能吗?