在我的应用程序中,通过发出请求来更改公共对象的状态,响应取决于状态.
class SomeObj():
def __init__(self, param):
self.param = param
def query(self):
self.param += 1
return self.param
global_obj = SomeObj(0)
@app.route('/')
def home():
flash(global_obj.query())
render_template('index.html')
Run Code Online (Sandbox Code Playgroud)
如果我在我的开发服务器上运行它,我希望得到1,2,3等等.如果同时向100个不同的客户提出请求,可能出现问题吗?预期的结果是100个不同的客户端每个都看到1到100之间的唯一数字.或者会发生这样的事情:
self.param增加1.self.param再次递增.由于只有两个客户端,预期结果为1和2,而不是2和3.跳过了一个数字.
当我扩展我的应用程序时,这会发生吗?我应该看一下全局变量的替代方案?
我正在尝试使用 Flask 的蓝图通过 API 提供机器学习模型,这是我的烧瓶__init__.py文件
from flask import Flask
def create_app(test_config=None):
app = Flask(__name__)
@app.route("/healthcheck")
def healthcheck() -> str:
return "OK"
# Registers the machine learning blueprint
from . import ml
app.register_blueprint(ml.bp)
return app
Run Code Online (Sandbox Code Playgroud)
ml.py包含/ml端点蓝图的文件
import numpy as np
from . import configuration as cfg
import tensorflow as tf
from flask import (
Blueprint, flash, request, url_for
)
bp = Blueprint("ml", __name__, url_prefix="/ml")
keras_model = None
graph = None
@bp.before_app_first_request
def load_model():
print("Loading keras model") …Run Code Online (Sandbox Code Playgroud) 与这个问题类似,我想在整个 Flask 应用程序(所有请求)之间共享一个变量。
我正在编译一个大数据文件(相当大的开销),并且希望尽可能少地进行编译 - 将结果存储在变量中,以便以后可以访问它。使用将flask.g不起作用,因为它在请求之间被擦除干净。
六年前,Armin Ronacher(Flask 的创建者)在Reddit 帖子中说道:
您可以将其附加到应用程序对象并通过 访问它
flask.current_app.whatever_variable。
这是我的两个问题:
A) 这仍然是推荐的做法吗?
B) 这两种方法(附加到应用程序工厂current_app或app应用程序工厂内部)是否等效?
使用current_app:
from flask import current_app
current_app.my_var = <<file>>
Run Code Online (Sandbox Code Playgroud)
使用应用程序工厂:
def create_app(config_filename):
app = Flask(__name__)
app.config.from_pyfile(config_filename)
app.my_var = <<file>>
...
return app
Run Code Online (Sandbox Code Playgroud) 根据在flask.request上存储每个请求数据是否安全?该g对象似乎是请求本地的(= 具有单个请求的生命周期)。也许我误解了这个答案,但 Flask 文档指出该g对象将是全局的,这似乎与这个答案相矛盾。
文档本身关于这些细节有点短,所以请您介意向上下文和全局对象解释细节g吗?具体解决以下问题:
request对象,g对象还是哪种对象?)app对象,g对象还是哪种对象?)app或g对象都需要在每个工作进程的生命周期内单独初始化。)