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
相关产品推荐
相关产品推荐

