我有一个远程存储项目,当用户请求他的文件时,django 服务器会在本地检索该文件(用于某些处理)并将其存储为临时文件,然后使用 mod x-sendfile 将其提供给用户。我当然希望临时文件在提供给用户后被删除。
文件指出NamedTemporaryFile
如果设置为则删除参数False
导致所有引用消失后删除文件。但是当用户得到服务时tempfile
,它不会被删除。如果我在下载时设置delete=True,我会得到“请求的URL/ServeSegment/Test.jpg/
在这个服务器上没找到。”
这是列出用户文件的视图:
def file_profile(request):
obj = MainFile.objects.filter(owner=request.user)
context = {'title': 'welcome',
'obj': obj
}
return render(request, 'ServeSegments.html', context=context)
这是检索、临时存储并提供所请求文件的视图:
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))
我想如果我可以设法用一条语句返回内部响应,然后写入最后一个块,它就会按我想要的方式工作,但是我没有找到关于如何确定我们是否处于最后一个循环的解决方案(而不是黑客)。
我应该做什么来服务tempfile
然后就立即删除了吗?
添加一个通用答案(基于 Cyrbil 的),通过在 finally 块中进行清理来避免使用信号。
虽然目录条目在退出时被 os.remove 删除,但底层文件仍保持打开状态,直到 FileResponse 将其关闭。您可以通过检查来检查这一点response._closable_objects[0].fileno()
在 pdb 的 finally 块中,并使用检查打开的文件lsof
在另一个终端暂停时。
如果您要使用此解决方案,那么您在 Unix 系统上似乎很重要(请参阅 os.remove 文档)
https://docs.python.org/3/library/os.html#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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)