如何解决我们可以在 FastAPI 中接收的上传文件的最大大小是多少? 反向代理ASGI 服务器ASGI 应用程序/框架
我正在尝试找出我的客户端可以上传的最大文件大小,以便我的 python fastapi 服务器可以毫无问题地处理它。
解决方法
您的请求不会直接到达 ASGI 应用。它经过反向代理(Nginx、Apache)、ASGI 服务器(uvicorn、hypercorn、gunicorn),然后由 ASGI 应用程序处理。
反向代理
对于 Nginx,body 大小由 client_max_body_size
控制,默认为 1MB。
对于 Apache,主体大小可以由 LimitRequestBody
控制,默认为 0。
ASGI 服务器
ASGI 服务器对主体大小没有限制。至少gunicorn、uvicorn、hypercorn是这样。
引自 Hypercorn 文档。
大型请求正文
这种攻击属于第二种类型,旨在通过邀请服务器接收大型请求正文(并将正文写入内存)来耗尽服务器的内存。配置不当的服务器对请求正文大小没有限制,并且可能允许单个请求耗尽服务器。
由框架来防范这种攻击。这是为了允许框架在需要时使用请求正文。
ASGI 应用程序/框架
由于 FastAPI 基于 Starlette。如何读取身体由Starlette处理。从源代码(0.14.3)读取,请求正文似乎也没有限制。
class Request(HTTPConnection):
...
async def stream(self) -> typing.AsyncGenerator[bytes,None]:
if hasattr(self,"_body"):
yield self._body
yield b""
return
if self._stream_consumed:
raise RuntimeError("Stream consumed")
self._stream_consumed = True
while True:
message = await self._receive()
if message["type"] == "http.request":
body = message.get("body",b"")
if body:
yield body
if not message.get("more_body",False):
break
elif message["type"] == "http.disconnect":
self._is_disconnected = True
raise ClientDisconnect()
yield b""
async def body(self) -> bytes:
if not hasattr(self,"_body"):
chunks = []
async for chunk in self.stream():
chunks.append(chunk)
self._body = b"".join(chunks)
return self._body
结论:如果您收到 413 Payload Too Large 错误,请检查反向代理。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。