Flask中如何在gunicorn启动前执行指定代码?
解决Flask+Gunicorn启动时变量未定义的问题
嘿,我明白你遇到的问题了!咱们先搞清楚为什么会报错,再一步步解决它~
问题原因
当你用gunicorn -b 0.0.0.0:8080 test:app启动服务时,Gunicorn是直接导入test模块来获取app对象的,这时候模块的__name__是test,而不是__main__——所以你写在if __name__ == '__main__':里的aa = "hello"根本不会被执行!这就是为什么访问接口时会报NameError: name 'aa' is not defined。
解决方案
根据你的需求,要让aa这类变量在Gunicorn启动前就运行,有几种简单的实现方式:
1. 直接把变量定义移到全局作用域(最简单的方式)
把aa的定义从if块里拿出来,放到模块的最外层,这样不管是直接运行python test.py还是用Gunicorn导入模块,变量都会被初始化:
from flask import Flask # 把变量移到全局作用域,启动时就会执行 aa = "hello" app = Flask(__name__) @app.route('/') def test(): return aa + "world!" if __name__ == '__main__': app.run()
2. 用应用工厂模式(适合复杂场景)
如果你的项目后续会有更多初始化逻辑(比如加载配置、连接数据库等),推荐用Flask的应用工厂模式,把所有启动前的逻辑放在工厂函数里:
from flask import Flask def create_app(): app = Flask(__name__) # 在这里执行所有启动前需要运行的代码 app.config['AA'] = "hello" # 可以把变量存在app的配置里 # 其他初始化操作,比如连接数据库、注册蓝图等 return app # 创建app实例,此时工厂里的初始化代码已经执行 app = create_app() @app.route('/') def test(): return app.config['AA'] + "world!" if __name__ == '__main__': app.run()
验证一下
修改完代码后,重新用Gunicorn启动:
gunicorn -b 0.0.0.0:8080 test:app
现在访问http://localhost:8080就能看到helloworld!啦~
内容的提问来源于stack exchange,提问作者XiaXuehai
相关产品推荐
相关产品推荐

