Flask+Mediapipe摄像头应用部署PythonAnywhere后静态输出故障求助
问题根因排查
- 前端请求地址硬编码错误
前端main.js中将帧上传地址写死为http://localhost:8000/capture_img,部署到PythonAnywhere后,代码运行在用户的本地浏览器,请求localhost只会指向用户自己的本地端口,不会把帧数据发送到公网的PythonAnywhere服务器,导致后台全局存储的帧一直是初始加载的ejemplo.dat静态文件,所以输出的处理画面永远不变。 - 流媒体响应头格式错误
app.py的generate函数中,响应头写为b'Content-Type: image/jpeg\r \n\r\n',存在多余空格和错误的换行格式,会导致浏览器解析MJPEG流失败,主动断开连接,触发日志中的SIGPIPE断管错误。 - 多worker进程数据不共享
PythonAnywhere默认用uWSGI多worker模式托管Flask应用,你用全局变量image存储帧数据,每个worker进程会持有独立的全局变量副本,上传帧的POST请求和拉流的/video_feed请求如果被分配到不同worker,拉流的worker永远拿不到最新的帧数据。 - 生产环境启动逻辑无效
app.py末尾的app.run(debug = True, port=8000)在PythonAnywhere的托管环境下不会执行,debug模式开启也会带来安全风险和性能问题。
修复方案
- 替换前端硬编码的上传地址,修改
main.js中的请求行为:
// 原代码 xhr.open('POST', 'http://localhost:8000/capture_img', true); // 替换为相对路径,自动适配部署域名 xhr.open('POST', '/capture_img', true);
- 修正响应头格式,修改
app.py的generate函数中的yield内容:
# 原代码 yield(b'--frame\r\n' b'Content-Type: image/jpeg\r \n\r\n' + frame + b'\r\n\r\n') # 替换为标准格式 yield(b'--frame\r\n' b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
- 删除
app.py末尾的app.run(debug = True, port=8000)代码,按PythonAnywhere的Flask部署规范配置WSGI文件,同时将应用的debug模式关闭。 - 调整PythonAnywhere的WSGI配置,将worker数量设置为1,保证POST请求和拉流请求使用同一个进程的全局变量;如果需要支持多并发,可以改用Redis、共享内存等跨进程存储方案存放当前帧数据。
- 可选优化:给全局变量
image的读写操作加线程锁,避免并发读写时出现半帧数据导致的解码错误。
内容的提问来源于stack exchange,提问作者Bovver Boy
相关产品推荐
相关产品推荐

