Flask生产环境启用allow_unsafe_werkzeug=True的风险及树莓派摄像头问题
问题解答
关于生产环境启用allow_unsafe_werkzeug=True的风险
直接给结论:绝对不建议在生产环境这么做。Werkzeug自带的服务器是纯开发调试用的,核心硬伤包括:
- 性能极差:只能处理极低并发,用户量稍大就会直接卡死崩溃,完全扛不住生产场景的流量
- 安全防护缺失:没有内置的限流、防扫描等基础安全机制,很容易成为攻击目标
- 稳定性不足:长时间运行易出现内存泄漏、进程无响应的情况,且没有自动恢复能力
哪怕你加了allow_unsafe_werkzeug=True,也只是关掉了警告提示,本质还是在用开发服务器,生产环境跑这个纯粹是给自己埋隐患。
解决gunicorn多实例导致摄像头冲突的办法
你的推测完全正确,gunicorn默认会启动多个worker进程,每个进程都会初始化摄像头,自然会出现资源抢占的问题。解决办法很直接:
- 启动gunicorn时强制指定1个worker进程,命令改成这样:
gunicorn --workers=1 --bind 0.0.0.0:5000 your_flask_app:app - 同时确保摄像头对象是全局初始化的,不要在路由函数里每次请求都创建实例。比如在Flask应用启动时就初始化摄像头,路由直接复用这个全局对象:
from flask import Flask, Response import cv2 app = Flask(__name__) # 全局初始化摄像头,仅执行一次 camera = cv2.VideoCapture(0) def generate_frames(): while True: success, frame = camera.read() if not success: break ret, buffer = cv2.imencode('.jpg', frame) frame = buffer.tobytes() yield (b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n') @app.route('/video_feed') def video_feed(): return Response(generate_frames(), mimetype='multipart/x-mixed-replace; boundary=frame') if __name__ == '__main__': app.run()
这样gunicorn只会运行一个进程,摄像头只会被初始化一次,就不会出现资源冲突的问题了。
内容的提问来源于stack exchange,提问作者Caleb
相关产品推荐
相关产品推荐

