gpt4 book ai didi

python - 如何在 Django 中提供创建的临时文件

转载 作者:太空狗 更新时间:2023-10-30 02:43:13 27 4
gpt4 key购买 nike

我有一个远程存储项目,当用户请求他的文件时,django 服务器检索文件并将其存储在本地(用于某些处理)作为临时文件,然后使用 mod x-sendfile 将其提供给用户。我当然希望临时文件在提供给用户后被删除。

文档说明 NamedTemporaryFile 删除参数如果设置为 False 会导致在所有引用都消失后删除文件。但是当用户收到 tempfile 时,它不会被删除。如果我在下载时设置 delete=True,我会得到“请求的 URL /ServeSegment/Test.jpg/ 未在此服务器上找到。”

这是一个列出用户文件的 View :

def file_profile(request):
obj = MainFile.objects.filter(owner=request.user)
context = {'title': 'welcome',
'obj': obj
}
return render(request, 'ServeSegments.html', context=context)

这是检索、临时存储和提供所请求文件的 View :

def ServeSegment(request, segmentID):    
if request.method == 'GET':
url = 'http://192.168.43.7:8000/foo/'+str(segmentID)
r = requests.get(url, stream=True)
if r.status_code == 200:
with tempfile.NamedTemporaryFile(dir=
'/tmp/Files', mode='w+b') as f:
for chunk in r.iter_content(1024):
f.write(chunk)
response = HttpResponse()
response['Content-Disposition'] = 'attachment; segmentID={0}'.format(f.name)
response['X-Sendfile'] = "{0}".format(f.name)
return response
else:
return HttpResponse(str(segmentID))

我想如果我能设法用一条语句返回内部的响应,然后写入最后一个 block ,它就会按我的意愿工作,但我没有找到关于如何确定我们是否在最后一个循环中的解决方案(不客气)。

我应该如何处理 tempfile 并在之后立即将其删除?

最佳答案

添加一个通用的答案(基于 Cyrbil 的),通过在 finally block 中进行清理来避免使用信号。

虽然目录条目在退出时被 os.remove 删除,但底层文件保持打开状态直到 FileResponse 关闭它。您可以通过使用 pdb 检查 finally block 中的 response._closable_objects[0].fileno() 来检查这一点,并在另一个终端暂停时使用 lsof 检查打开的文件。

如果您要使用此解决方案,您使用的是 Unix 系统似乎很重要(请参阅 os.remove 文档)

https://docs.python.org/3/library/os.html#os.remove

import os
import tempfile
from django.http import FileResponse

def my_view(request):
try:
tmp = tempfile.NamedTemporaryFile(delete=False)
with open(tmp.name, 'w') as fi:
# write to your tempfile, mode may vary
response = FileResponse(open(tmp.name, 'rb'))
return response
finally:
os.remove(tmp.name)

关于python - 如何在 Django 中提供创建的临时文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34249632/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com