Uvicorn+Quart接收POST请求时出现413请求实体过大错误排查
解决Quart+Uvicorn接收大JSON请求返回413错误的问题
你的问题出在配置参数找错了:你设置的ws_max_size和h11_max_incomplete_event_size和HTTP POST请求体大小限制无关,真正需要调整的是Quart的内容长度限制和Uvicorn的请求体大小限制。
问题根源
ws_max_size:仅针对WebSocket连接的消息大小,不影响普通HTTP请求。h11_max_incomplete_event_size:是h11库处理HTTP协议时的不完整事件缓冲区大小,并非请求体的总大小限制。- Quart默认有
MAX_CONTENT_LENGTH配置(默认值16MB),超过这个值会直接返回413。 - Uvicorn默认的
max_request_size参数(默认值1MB)也会限制请求体大小,超过同样返回413。
修复方案
同时调整Quart的MAX_CONTENT_LENGTH和Uvicorn的max_request_size参数,匹配你需要支持的最大请求体大小:
from quart import Quart, request import uvicorn app = Quart(__name__) # 设置Quart允许的最大请求体大小,这里设为4GB(2^32字节) app.config['MAX_CONTENT_LENGTH'] = 2**32 @app.route('/', methods=['POST']) async def hello(): json_data = await request.json return ('', 204) # 配置Uvicorn时添加max_request_size参数,值和Quart保持一致 config = uvicorn.Config( app, host="127.0.0.1", port=8000, max_request_size=2**32, # 关键:设置HTTP请求体最大大小 ws_max_size=2**64, h11_max_incomplete_event_size=2**64, ) server = uvicorn.Server(config) server.run()
注意事项
- 测试代码中发送
2**32个字符的字符串(约4GB)会占用大量内存,可能导致本地机器内存不足,建议先使用较小的大字符串测试(比如2**24,约16MB)验证功能正常。 - 如果需要支持更大的请求体,可以进一步调整这两个参数的值,但要考虑服务器的内存和带宽承载能力。
内容的提问来源于stack exchange,提问作者Sam Coutteau
相关产品推荐
相关产品推荐

