用户上传一个 200 MB 的文件,Django 会把它整个读进内存吗?什么时候写临时文件?这篇在真实 gunicorn 上直接量 worker 的内存,并看不同大小的上传得到什么对象。
上传 1 MiB → InMemoryUploadedFile size=1048576 上传 2 MiB → InMemoryUploadedFile size=2097152 上传 3 MiB → TemporaryUploadedFile size=3145728 临时文件存在=True 上传 50 MiB → TemporaryUploadedFile size=52428800 临时文件存在=True (临时文件的目录: /var/folders/km/b69gr9cs3dv8qsm8rjjb4qqc0000gn/T ;视图返回时它还在,响应发出后被清理)
请求体是分块读取并交给「上传处理器」的。默认的 MemoryFileUploadHandler 在内容小于阈值时把它留在内存,超过则由 TemporaryFileUploadHandler 写入临时文件。
worker 起始 RSS ≈ 46 MiB;上传 200 MiB(TemporaryUploadedFile)期间峰值 RSS ≈ 46 MiB
worker 起始 RSS ≈ 42 MiB;上传 200 MiB(InMemoryUploadedFile)期间峰值 RSS ≈ 246 MiB
默认设置下上传大文件不会撑爆内存;只有主动调大阈值才会。这不是说安全——磁盘临时文件占用与上传并发数成正比(本文没有测并发)。
上传 5 MiB → 临时文件目录: <实验目录> 是否等于指定目录: True
视图返回、响应发出后临时文件被清理(视图里能看到文件存在)。