首页 > 解决方案 > Flask 表示会话开始/结束

问题描述

烧瓶中是否有可能只做一次某事,例如当应用程序启动或关闭时?

我需要在文件中存储一些东西,当烧瓶应用程序启动时,只要它打开就可以读取它,最好在应用程序关闭时删除它,或者至少在下一个会话中覆盖它.

我想过声明一个“bool”“setup_done”,但我找不到一个好的地方来声明它。我希望它保持不变,即使页面被刷新,也只能在烧瓶应用程序本身启动或关闭时更改。

我的尝试是:

@app.route('/')
def myfunction:
    if not setup_done:
         do_setup()
         setup_done = True
    else:
         do_something_else()

if __name__ == "__main__":
    setup_done=False
    app.run(debug=DEVELOPMENT_ENV)


但是当然,这里的变量 setup_done 在 myfunction 中使用时是未知的。

我希望有一个基于“简单编程”的解决方案,而不是导入新的包或功能。

如果表达不好,我很抱歉,我希望它清楚我想要做什么。

标签: pythonflask

解决方案


如果您使用应用程序工厂模式,这很简单。

from flask import Flask


def create_app():
    app = Flask('__name__')
    print("RUNNING SETUP TASKS") # This is where your function call goes
    return app

app = create_app()

@app.route('/')
def home():
    return "Hello"

if __name__ == '__main__':
    app.run(debug=True)

您会注意到,我没有将此附加到基本路由 ( @app.route('/')),因为 a) 要求用户访问该路由,并且 b) 将在每次有人访问该路由时运行。对于这种事情还有其他机制,例如before_first_request.

话虽如此,我将需要研究如果您开始通过 gunicorn 运行应用程序(尤其是类似的东西prefork)会发生什么,因为您的文件写入功能可能会运行多次;每个进程一个。

您在“会话”和“应用程序”之间跳转可互换性。为了给你更多细节,我需要确切地知道你正在尝试做什么,因为这些是不同的事情。


推荐阅读