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

如何使用Gunicorn运行封装在类中的Flask服务器?

解决Gunicorn运行类封装Flask服务的问题

错误原因

你执行的启动命令gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 WebServer:my_app报错,是因为my_app仅在if __name__ == "__main__"代码块内定义。Gunicorn启动服务时不会执行该代码块,因此无法找到my_app这个属性。

正确解决方案

方法1:在模块级别暴露Flask实例

修改你的代码,在if __name__ == "__main__"代码块外部创建WebServer实例,并直接暴露Flask的app对象:

class WebServer:
    def __init__(self):
        self.app = Flask(__name__)
        self.generateURL()
       
    def generateURL(self):
        self.app.route("/")(self.test)
        self.app.route('/weight', methods=['GET'])(self.receive_weight)
        self.app.route('/usage', methods=['GET'])(self.receive_usage)

    # ... 其他方法 ...

    def run(self):
        # 建议移除debug=True,避免和Gunicorn冲突,可通过环境变量控制
        debug = os.environ.get("DEBUG", "False").lower() == "true"
        self.app.run(debug=debug, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

# 在模块级别创建实例并暴露app
server = WebServer()
app = server.app

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

然后使用以下命令启动(将your_file_name替换为你的Python文件名,比如server.py就写server):

gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 your_file_name:app

方法2:使用工厂函数返回Flask实例

如果不想在模块级别提前创建实例,可以添加一个工厂函数:

class WebServer:
    # ... 类代码保持不变 ...

def create_app():
    server_instance = WebServer()
    return server_instance.app

if __name__ == "__main__":
    my_app = WebServer()
    my_app.run()

启动命令改为:

gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 your_file_name:create_app()

额外注意事项

  • 不要在Gunicorn运行时启用Flask的debug=True,该模式会启动额外的调试服务器,和Gunicorn冲突。
  • 确保你的Python文件可以被Gunicorn找到,若不在当前目录,需指定路径或调整Python环境变量。

内容的提问来源于stack exchange,提问作者FYY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:57:28