flask默认不限制上传大小,但受werkzeug底层限制为500kb,超限直接返回413错误;需通过app.config['max_content_length']设置字节数,并同步调整nginx等反向代理的client_max_body_size。

Flask默认上传文件大小限制是多少
Flask 默认把 MAX_CONTENT_LENGTH 设为 None,看似不限制,但实际受底层 Werkzeug 限制——它默认只接受最大 500KB 的请求体。超过就直接返回 413 Request Entity Too Large 错误,连路由函数都进不去。
常见现象:前端选了 2MB 的图片,request.files 为空,日志里看不到你的打印语句,浏览器只显示 413。
- 这个限制在请求解析阶段触发,早于视图函数执行
- 不是 Nginx/Apache 的锅(除非你真配了 proxy_buffer 或 client_max_body_size)
- 修改必须在 Flask 应用实例创建后、首次请求前完成
正确设置MAX_CONTENT_LENGTH的三种方式
关键点:必须在 app = Flask(__name__) 之后、app.run() 或部署前设置,且不能写在路由里。
-
方式一(推荐): 直接赋值:
app = Flask(__name__)<br>app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16MB
-
方式二: 用
configure():app.config.update(MAX_CONTENT_LENGTH=8 * 1024 * 1024)
-
方式三(配置文件): 在
config.py中写MAX_CONTENT_LENGTH = 32 * 1024 * 1024,再app.config.from_pyfile('config.py')
注意:单位是字节,别错写成 16 * 1024(那是 16KB);也别用字符串如 "16MB" —— Flask 不解析单位。
为什么设了MAX_CONTENT_LENGTH还是报413
大概率是反向代理或 WSGI 服务器加了额外限制,和 Flask 本身无关。
- Nginx 需同步改
client_max_body_size(例如client_max_body_size 20M;),并重载配置 - uWSGI 要加
--limit-post 20971520(单位字节)或配置项limit-post = 20971520 - Gunicorn 用
--max-requests 1000 --max-requests-jitter 100不影响上传,但需确认没配--limit-request-body(默认 0 表示不限) - 本地调试用
app.run()时,Werkzeug 开发服务器不拦截大 body,只看 Flask 配置
上传大文件时还要注意什么
MAX_CONTENT_LENGTH 只控制总请求体大小,不解决内存爆满、超时、用户体验差等问题。
- 文件太大时,
request.files['xxx'].read()会一次性加载进内存,建议用stream.read(8192)分块读 - 浏览器上传可能超时,需前端配合加 loading 和取消机制,后端加
timeout配置(如 Gunicorn 的--timeout) - 不要依赖
request.files的filename做安全校验——它可被伪造,必须检查content-type和文件头 - 如果真要传 GB 级文件,该上分片上传(如 tus.io)或直传对象存储,绕过 Flask 请求体解析
最常被忽略的是:Nginx 和 Flask 的限制必须同时调大,且单位统一用字节;设完不重启服务或不重载 Nginx,等于没设。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











