如何使用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
相关产品推荐
相关产品推荐

