如何在 Django 中下载临时文件?
How can I download a temporary file in Django?
我正在学习如何在 Django 中提供临时文件,即使在阅读 docs 之后,我在完成所有内容时也遇到了一些困难。这些文件是根据用户输入临时动态生成的。
def get_queryset(self):
gcode = "/home/bradman/Documents/Programming/DjangoWebProjects/3dprinceprod/fullprince/media/uploads/tmp/skull.gcode"
test_file = open(gcode, 'r')
response = HttpResponse(test_file, content_type='text/plain')
response['Content-Disposition'] = "attachment; filename=%s.gcode" % title
print (response)
return response
上面的代码应该将我的临时 gcode 文件从我的服务器放入一个 HttpResponse 对象中,return 函数应该下载该文件。甚至像下载一样变慢,但下载完后没有文件
This question provided most of the useful info and this one 也很有帮助,但我无法让它工作,也不知道如何测试它。我不确定移动到 apache 或其他东西是否合适,因为我有用户权限问题,并且这些文件在下载后会立即删除。我检查过 "gcode" 是目录 url,gcode content_type 应该是 text/plain。所以基本上,我怎样才能真正下载我的回复?
编辑1
这是完整的代码,不仅仅是有问题的部分。
class SubFileViewSet(viewsets.ModelViewSet):
queryset = subfiles.objects.all()
serializer_class = SubFilesSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,
IsOwnerOrReadOnly,)
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
def get_queryset(self):
req = self.request
make = req.query_params.get('make')
model = req.query_params.get('model')
plastic = req.query_params.get('plastic')
quality = req.query_params.get('qual')
filenum = req.query_params.get('fileid')
hotend = req.query_params.get('hotendtemp')
bed = req.query_params.get('bedtemp')
if make and model and plastic and quality and filenum:
filepath = subfiles.objects.values('STL', 'FileTitle').get(fileid = filenum)
path = filepath['STL']
title = filepath['FileTitle']
gcode = TheMagic(
make=make,
model=model,
plastic=plastic,
qual=quality,
path=path,
title=title,
hotendtemp=hotend,
bedtemp=bed)
test_file = open(gcode, 'r')
response = HttpResponse(test_file, content_type='text/plain')
response['Content-Disposition'] = "attachment; filename=%s.gcode" % title
print (response.content)
return response
else:
print ('normal or non complete download')
return self.queryset
我正在使用 Django Rest Framework 并尝试从我的 API get 请求创建动态响应以对 URL 中给定的参数做出反应。所以我发送一个 get 请求传递变量作为参数,它根据这些变量创建一个文件,最后发回创建的文件。除了最后的实际文件下载外,所有这些都已经有效。获取请求 return 是一个 HTTP 500 错误。
为了测试,您可以创建这样的视图:
def download_file(request):
gcode = "/home/bradman/Documents/Programming/DjangoWebProjects/3dprinceprod/fullprince/media/uploads/tmp/skull.gcode"
resp = HttpResponse('')
with open(gcode, 'r') as tmp:
filename = tmp.name.split('/')[-1]
resp = HttpResponse(tmp, content_type='application/text;charset=UTF-8')
resp['Content-Disposition'] = "attachment; filename=%s" % filename
return resp
如果你在 shell (django) 中测试:
print(response.content)
在您的代码末尾,以确保您的文件已被读取。
根据一些额外的研究 here 看来,由于 get_query 函数需要一个 QuerySet,而不是 Response 对象。感谢上面建议的测试方法,我知道我的问题是 Django Rest Framework 视图集,并且超出了原始问题的范围。
我正在学习如何在 Django 中提供临时文件,即使在阅读 docs 之后,我在完成所有内容时也遇到了一些困难。这些文件是根据用户输入临时动态生成的。
def get_queryset(self):
gcode = "/home/bradman/Documents/Programming/DjangoWebProjects/3dprinceprod/fullprince/media/uploads/tmp/skull.gcode"
test_file = open(gcode, 'r')
response = HttpResponse(test_file, content_type='text/plain')
response['Content-Disposition'] = "attachment; filename=%s.gcode" % title
print (response)
return response
上面的代码应该将我的临时 gcode 文件从我的服务器放入一个 HttpResponse 对象中,return 函数应该下载该文件。甚至像下载一样变慢,但下载完后没有文件
This question provided most of the useful info and this one 也很有帮助,但我无法让它工作,也不知道如何测试它。我不确定移动到 apache 或其他东西是否合适,因为我有用户权限问题,并且这些文件在下载后会立即删除。我检查过 "gcode" 是目录 url,gcode content_type 应该是 text/plain。所以基本上,我怎样才能真正下载我的回复?
编辑1
这是完整的代码,不仅仅是有问题的部分。
class SubFileViewSet(viewsets.ModelViewSet):
queryset = subfiles.objects.all()
serializer_class = SubFilesSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,
IsOwnerOrReadOnly,)
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
def get_queryset(self):
req = self.request
make = req.query_params.get('make')
model = req.query_params.get('model')
plastic = req.query_params.get('plastic')
quality = req.query_params.get('qual')
filenum = req.query_params.get('fileid')
hotend = req.query_params.get('hotendtemp')
bed = req.query_params.get('bedtemp')
if make and model and plastic and quality and filenum:
filepath = subfiles.objects.values('STL', 'FileTitle').get(fileid = filenum)
path = filepath['STL']
title = filepath['FileTitle']
gcode = TheMagic(
make=make,
model=model,
plastic=plastic,
qual=quality,
path=path,
title=title,
hotendtemp=hotend,
bedtemp=bed)
test_file = open(gcode, 'r')
response = HttpResponse(test_file, content_type='text/plain')
response['Content-Disposition'] = "attachment; filename=%s.gcode" % title
print (response.content)
return response
else:
print ('normal or non complete download')
return self.queryset
我正在使用 Django Rest Framework 并尝试从我的 API get 请求创建动态响应以对 URL 中给定的参数做出反应。所以我发送一个 get 请求传递变量作为参数,它根据这些变量创建一个文件,最后发回创建的文件。除了最后的实际文件下载外,所有这些都已经有效。获取请求 return 是一个 HTTP 500 错误。
为了测试,您可以创建这样的视图:
def download_file(request):
gcode = "/home/bradman/Documents/Programming/DjangoWebProjects/3dprinceprod/fullprince/media/uploads/tmp/skull.gcode"
resp = HttpResponse('')
with open(gcode, 'r') as tmp:
filename = tmp.name.split('/')[-1]
resp = HttpResponse(tmp, content_type='application/text;charset=UTF-8')
resp['Content-Disposition'] = "attachment; filename=%s" % filename
return resp
如果你在 shell (django) 中测试:
print(response.content)
在您的代码末尾,以确保您的文件已被读取。
根据一些额外的研究 here 看来,由于 get_query 函数需要一个 QuerySet,而不是 Response 对象。感谢上面建议的测试方法,我知道我的问题是 Django Rest Framework 视图集,并且超出了原始问题的范围。