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

uWSGI部署Flask应用POST请求返回400 Bad Request如何调试?

uWSGI部署Flask应用POST接口返回400问题排查步骤

优先排查uWSGI层问题(直接访问uWSGI已复现400,可先排除Nginx影响)

  • 打印400错误的具体原因
    在Flask应用中添加全局400错误处理器,捕获请求上下文信息,定位解析失败根源:

    from flask import request, jsonify
    
    @app.errorhandler(400)
    def handle_bad_request(error):
        # 输出请求头、原始请求体、错误详情到日志
        print("=== 400错误调试信息 ===")
        print("请求头:", dict(request.headers))
        print("原始请求体:", request.get_data(as_text=True))
        print("错误详情:", str(error))
        return jsonify(err_msg=str(error), req_headers=dict(request.headers)), 400
    

    重启uWSGI后重新发起POST请求,查看应用日志即可定位是JSON格式错误、请求头缺失还是请求体截断问题。

  • 调整uWSGI缓冲区大小
    uWSGI默认请求缓冲区仅为4KB,若POST的JSON数据超过该大小会被截断,导致JSON解析失败返回400。启动uWSGI时添加--buffer-size 65536参数将缓冲区调整为64KB验证:

    uwsgi --socket 0.0.0.0:5555 --protocol=http -w runserver:app --buffer-size 65536
    
  • 验证请求头传递
    部分场景下uWSGI会过滤非标准请求头,或者发起请求时未携带Content-Type: application/json,会导致Flask的request.get_json()无法正常解析数据。可通过curl命令手动指定请求头测试:

    curl -X POST http://<你的服务器IP>:5555/distance/term -H "Content-Type: application/json" -d '{"test_key":"test_value"}'
    

    若该请求可正常返回,说明是请求发起端未正确传递Content-Type头导致的问题。

  • 检查POST缓冲配置
    若uWSGI启动参数中开启了--post-buffering,会自动解析表单类型的POST请求,可能会覆盖JSON类型请求的原始请求体,导致Flask无法拿到有效数据。可暂时移除该类配置验证是否恢复正常。

uWSGI层问题解决后排查Nginx配置

  • 确认Nginx转发时保留了必要请求头,反向代理配置中需包含以下字段:
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:5555;
        # 若用HTTP代理方式需配置以下header
        # proxy_pass http://127.0.0.1:5555;
        # proxy_set_header Content-Type $content_type;
        # proxy_set_header Host $host;
        # proxy_set_header X-Real-IP $remote_addr;
    }
    
  • 确认Nginx的client_max_body_size配置足够大,避免POST请求被Nginx提前拦截。

内容的提问来源于stack exchange,提问作者Mayur Ekbote

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:54:10