InMemoryUploadedFile真的"在内存中"吗?

Pra*_*tal 8 python django memory-management

我知道打开一个文件只会创建一个文件处理程序,它接受一个固定的内存,而不管文件的大小.Django有一个类型InMemoryUploadedFile,表示通过表单上传的文件.

我在django视图中获取了我的文件对象的句柄,如下所示:

file_object = request.FILES["uploadedfile"]
Run Code Online (Sandbox Code Playgroud)

这个file_object有类型InMemoryUploadedFile.

现在我们可以看到,file_object具有.read()用于将文件读入内存的方法.

bytes = file_object.read()
Run Code Online (Sandbox Code Playgroud)

类型的file_object是否InMemoryUploadedFile已经"在内存中"?

Pra*_*kar 8

read()文件对象上的方法是从文件对象内访问内容的方式,而不管该文件是在内存中还是存储在磁盘上.它类似于其他实用程序文件的访问方法,如readlinesseek.

这种行为类似于Python 内置的行为,后者又是基于操作系统的fread()方法构建的.

从文件中读取最多大小字节(如果读取在获取大小字节之前达到EOF,则更少).如果size参数为负数或省略,则读取所有数据,直到达到EOF.字节作为字符串对象返回.立即遇到EOF时返回空字符串.(对于某些文件,如ttys,在EOF被命中后继续读取是有意义的.)注意,此方法可能多次调用底层C函数fread(),以尽可能接近大小字节.另请注意,在非阻塞模式下,即使未给出大小参数,也可能返回的数据少于请求的数据.

关于InMemoryUploadedFile存储的确切位置的问题,它有点复杂.

在保存上传的文件之前,需要将数据存储在某处.

默认情况下,如果上传的文件小于2.5兆字节,Django会将上传的全部内容保存在内存中.这意味着保存文件只涉及从内存中读取和写入磁盘,因此非常快.

但是,如果上传的文件太大,Django会将上传的文件写入存储在系统临时目录中的临时文件中.在类似Unix的平台上,这意味着你可以期待Django生成一个名为/tmp/tmpzfp6I6.upload的文件.如果上传足够大,您可以观看此文件的大小增长,因为Django将数据流式传输到磁盘上.

这些细节 - 2.5兆字节; 的/ tmp; 等 - 只是"合理的默认值".请继续阅读,了解有关如何自定义或完全替换上载行为的详细信息.