在视图中,我创建了一个新文件:
sys.stdout = open(backup_name, 'w')
call_command('dumpdata')
我现在如何将此文件返回给用户?
我尝试将HttpResponse中的mimetype更改为'application / json'但是如何将文件内容添加到响应中?
或许还有其他方法可以返回文件?
答案 0 :(得分:4)
我知道这有点晚了,但我发现这是一个有用的起点,所以我认为其他人也可以从我发现的内容中受益。
对于小文件,如果将json文件放在模板文件夹中,django可以找到它并且您可以使用render_to_response
返回它:
return render_to_response(data_file,mimetype='application/json')
我发现这对某些浏览器上的大型数据集有问题。我会收到错误An existing connection was forcibly closed by the remote host
。另一种方法是解决这个问题。
首先,您必须创建文件的完整路径。使用PROJECT_ROOT变量(由settings.py中的PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
定义)。要访问this和os方法,您必须在views.py中import settings, os
。获得此文件位置后,您可以使用以下代码返回它:
backup_path = os.path.join(settings.PROJECT_ROOT, "templates", "json_dumps", "large_file.json")
return HttpResponse(open(backup_path, 'r'),content_type = 'application/json; charset=utf8')
我发现这适用于非常大的文件。
答案 1 :(得分:1)
好的,我有:
response = HttpResponse(open(backup_path, "r"), mimetype='application/json', )
response['Content-Disposition'] = "filename=%s" % backup_name"
在光盘上保存文件后,我打开它进行阅读并设置文件名作为响应。
任何人都有另一个想法?
答案 2 :(得分:1)
只需复制/链接/调用与模型序列化相关的dumpdata代码,并将其直接转储到响应中,这样可以避免权限问题和文件系统污染。内容配置和mimetype仍然适用。
请记住,dumpdata 可以是一个长时间的过程,因此您会遇到超时。
答案 3 :(得分:1)
我试图将字典作为json文件返回。这是我的解决方案:
import json
import cStringIO as StringIO
from wsgiref.util import FileWrapper
from django.http import HttpResponse
data_string = json.dumps(data)
json_file = StringIO.StringIO()
json_file.write(data_string)
json_file.seek(0)
wrapper = FileWrapper(json_file)
response = HttpResponse(wrapper, content_type='application/json')
response['Content-Disposition'] = 'attachement; filename=dump.json'
return response
答案 4 :(得分:0)
我的最终解决方案是(感谢saverio):
response = HttpResponse(mimetype='application/json', )
response['Content-Disposition'] = "filename=%s" % backup_name
sys.stdout = response
call_command('dumpdata')