在视图中返回json文件

时间:2011-08-08 10:11:09

标签: django django-views httpresponse

在视图中,我创建了一个新文件:

sys.stdout = open(backup_name, 'w')
call_command('dumpdata')

我现在如何将此文件返回给用户?

我尝试将HttpResponse中的mimetype更改为'application / json'但是如何将文件内容添加到响应中?

或许还有其他方法可以返回文件?

5 个答案:

答案 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')