You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:33:31