Django 服务器上的 413 Payload Too Large

Posted

技术标签:

【中文标题】Django 服务器上的 413 Payload Too Large【英文标题】:413 Payload Too Large on Django server 【发布时间】:2019-08-06 23:59:08 【问题描述】:

每当我们尝试将大文件上传到我们的 Django 后端时,我的团队都会遇到 413 错误:413 Payload too large

我们无法准确确定可接受的最大文件大小 - 它似乎在 1-3MB 范围内摇摆不定。

我们排除的东西:

这不是网络服务器配置问题,因为我们正在运行 本地 Django 服务器(没有网络服务器)

我们认为这不是应用服务器配置问题,因为这发生在多个应用服务器上(./manage.py runserverdaphne -p 8000 topknott.asgi:application)

这不是 Django 模型上的字段的问题,看起来 正常:photo = models.ImageField(blank=True)

谁能发现我们遗漏了什么?

【问题讨论】:

前面有nginx吗? 不,我没有——它在我的机器上本地运行。 (./manage.py runserver) 我在 Django 代码库中没有看到任何与“413”相关的命中。您是否使用第三方文件存储引擎?无论如何,请尝试调整FILE_UPLOAD_MAX_MEMORY_SIZE 设置。 【参考方案1】:

据我所知,runserver 或 daphne 永远不会返回 413。看起来你在 python 服务器前面有 NGINX。

您可以在 nginx.conf 的 server 块中使用 client_max_body_size 更改限制

    server 
        client_max_body_size 20M;
        listen       80;
        server_name  localhost;
        location / 
            proxy_pass         http://127.0.0.1:8000/;
        
    

【讨论】:

我在我的机器上本地运行 Django 服务器。这意味着 Python 服务器前面没有网络服务器(没有 NGINX)【参考方案2】:

Django 有一个内置机制来防止任何可疑活动。

在你的 settings.py 文件中设置变量

DATA_UPLOAD_MAX_MEMORY_SIZE = 10*1024*1024  # your size limit in bytes

查看文档:https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-DATA_UPLOAD_MAX_MEMORY_SIZE

【讨论】:

【参考方案3】:

如果您的团队曾经/正在使用 Django Channels,则在 2.1.7 中引入的一段代码会导致意外的 413 错误(已讨论 here)。不过,这已在 2.3.0 中得到修复。

【讨论】:

你刚刚救了我的命

以上是关于Django 服务器上的 413 Payload Too Large的主要内容,如果未能解决你的问题,请参考以下文章

Strapi GraphQL 413 Payload too large request 错误

413 请求实体太大 nginx django

413 请求实体太大 + Web 服务器连接已关闭 |错误 64

django 2 自定义 jwt_get_username_from_payload_handler

绕过 Elasticbeanstalk 中托管的 api 响应上的 NGINX 413 错误页面

Django Rest with JWT,获取 AttributeError:无效的 API 设置:'JWT_PAYLOAD_HANDLER'