一尘不染

Flask应用程序启动后运行代码

flask

我的目标是让我的Flask应用程序启动后运行任意代码。这是我所拥有的:

def run():
    from webapp import app
    app.run(debug=True, use_reloader=False)

理想情况下,我将能够做到这一点:

def run():
    from webapp import app
    app.run(debug=True, use_reloader=False)
    some_code()

但是代码不会继续过去app.run(),因此some_code()永远不会运行。

我目前正在解决的解决方案是在与app.run()分开的线程中运行some_code(),创建一个设置此功能的before first request函数:

app.is_running = True

然后获取some_code()来向应用发出基本请求,以便运行“先请求之前”代码。这相当复杂,难以记录。我宁愿使用Flask中已经提供的app.is_running参数,也可以使用@app.after_server_start装饰器,但据我所知,这两个都不存在。


阅读 2255

收藏
2020-04-06

共1个答案

一尘不染

如果你需要在启动Flask应用程序之后但严格在第一个请求之前执行一些代码,而不是由@ app.before_first_request可以处理的第一个请求的执行触发,则应使用CESCO所说的Flask_Script,但是你可以继承Server类并覆盖__ call __方法,而不是使用@ manager.command覆盖runserver命令:

from flask import Flask
from flask_script import Manager, Server

def custom_call():
    #Your code
    pass

class CustomServer(Server):
    def __call__(self, app, *args, **kwargs):
        custom_call()
        #Hint: Here you could manipulate app
        return Server.__call__(self, app, *args, **kwargs)

app = Flask(__name__)
manager = Manager(app)

# Remeber to add the command to your Manager instance
manager.add_command('runserver', CustomServer())

if __name__ == "__main__":
    manager.run()

这样,你就不会覆盖runserver命令的默认选项。

2020-04-06