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

Flask+Mediapipe摄像头应用部署PythonAnywhere后静态输出故障求助

问题根因排查

  1. 前端请求地址硬编码错误
    前端main.js中将帧上传地址写死为http://localhost:8000/capture_img,部署到PythonAnywhere后,代码运行在用户的本地浏览器,请求localhost只会指向用户自己的本地端口,不会把帧数据发送到公网的PythonAnywhere服务器,导致后台全局存储的帧一直是初始加载的ejemplo.dat静态文件,所以输出的处理画面永远不变。
  2. 流媒体响应头格式错误
    app.py的generate函数中,响应头写为b'Content-Type: image/jpeg\r \n\r\n',存在多余空格和错误的换行格式,会导致浏览器解析MJPEG流失败,主动断开连接,触发日志中的SIGPIPE断管错误。
  3. 多worker进程数据不共享
    PythonAnywhere默认用uWSGI多worker模式托管Flask应用,你用全局变量image存储帧数据,每个worker进程会持有独立的全局变量副本,上传帧的POST请求和拉流的/video_feed请求如果被分配到不同worker,拉流的worker永远拿不到最新的帧数据。
  4. 生产环境启动逻辑无效
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:27:01