我正在使用Django读取ajax上传的文件以将其存储在模型中。上传请求包含原始上传的图像数据。
def my_view(request):
upload = request
model_instance.image_field.save(uniquename, ContentFile(upload.read()))
如果重要,我使用AmazonS3作为上传文件的存储后端。
在包含此代码的函数中的某处,我有内存泄漏。
执行此操作后,是否需要拨打upload.close()
来释放资源/内存?
或者我的记忆问题来自其他问题,在这个函数的其他地方?
答案 0 :(得分:15)
python垃圾收集器将在不再引用文件时关闭文件。
如果你的upload
变量是函数中的局部变量,它将在函数返回时被清除。因此,在正常的垃圾收集周期中,所引用的文件upload
将自动关闭。
也就是说,关闭文件可能更好。您可以将该文件用作context manager,并在退出上下文时自动关闭:
with open('yourfilepath.ext') as upload:
model_instance.image_field.save(uniquename, ContentFile(upload.read()))
如果upload
是Django为您生成的,打开并准备就绪,您仍然可以使用contextlib.closing
decorator自动关闭它:
import contextlib
with contextlib.closing(upload):
model_instance.image_field.save(uniquename, ContentFile(upload.read()))
要回答你的其余问题:你的泄密最有可能发生在其他地方。