使用Flask+Gunicorn时Werkzeug是否仍被使用?如何正确部署?
使用Flask搭配Gunicorn部署时,Werkzeug是否仍会被使用?
核心结论
- 用正确的Gunicorn启动方式时,不会出现双WSGI服务器串联的情况,Werkzeug的开发服务器不会被启动;
- Werkzeug本身是Flask的核心依赖,无法完全移除,它为Flask提供了请求处理、路由匹配、WSGI协议适配等基础功能,和开发服务器是独立的两个部分。
先纠正你的启动命令问题
你当前用gunicorn --bind 0.0.0.0:5000 app:cli启动是不符合预期用法的。Gunicorn需要的是一个符合WSGI规范的可调用应用实例,而cli是Flask的CLI命令组对象,并非标准WSGI应用。这种启动方式能运行只是巧合(部分Flask版本的CLI对象可能兼容WSGI调用,但这不是设计初衷),而且确实可能触发不必要的Werkzeug服务器逻辑。
正确的启动方式应该指向你的Flask应用工厂或实例:
- 指向应用工厂函数:
gunicorn --bind 0.0.0.0:5000 app:create_app
- 或者修改代码导出应用实例:
# 在app.py末尾添加 app = create_app()
然后用以下命令启动:
gunicorn --bind 0.0.0.0:5000 app:app
关于Werkzeug的角色
- 当用Gunicorn正确启动时,Gunicorn作为生产级WSGI服务器,直接接收HTTP请求,然后调用Flask的WSGI应用接口,不会触发Werkzeug的
run_simple开发服务器,也就不存在双服务器串联的问题。 - Werkzeug是Flask的核心依赖,Flask的请求解析、响应生成、路由匹配等核心逻辑都依赖Werkzeug实现,哪怕不用它的开发服务器,也必须保留Werkzeug依赖,无法移除。
总结
- 不要用
app:cli作为Gunicorn的启动入口,改用正确的WSGI应用实例/工厂; - 正确部署后,Werkzeug的开发服务器不会运行,但Werkzeug本身依然是Flask不可或缺的一部分;
- 这才是Flask+Gunicorn部署的预期用法。
内容的提问来源于stack exchange,提问作者Pierre
相关产品推荐
相关产品推荐

