我的目标是让我的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()
我目前正在解决的解决方案是在与app.run()分开的线程中运行some_code(),创建一个设置此功能的before first request函数:
app.run()
before first request
app.is_running = True
然后获取some_code()来向应用发出基本请求,以便运行“先请求之前”代码。这相当复杂,难以记录。我宁愿使用Flask中已经提供的app.is_running参数,也可以使用@app.after_server_start装饰器,但据我所知,这两个都不存在。
some_code(
app.is_running
@app.after_server_start
如果你需要在启动Flask应用程序之后但严格在第一个请求之前执行一些代码,而不是由@ app.before_first_request可以处理的第一个请求的执行触发,则应使用CESCO所说的Flask_Script,但是你可以继承Server类并覆盖__ call __方法,而不是使用@ manager.command覆盖runserver命令:
__ call __
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命令的默认选项。