Вернуть JSON-файл в виде - PullRequest
       40

Вернуть JSON-файл в виде

2 голосов
/ 08 августа 2011

В представлении я создаю новый файл с:

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

Как теперь я могу вернуть этот файл пользователю?

Я попытался изменить mimetype в HttpResponse на 'application / json'но как я могу добавить содержимое файла в ответ?

Или, может быть, есть другой способ вернуть файл?

.

Ответы [ 5 ]

4 голосов
/ 17 апреля 2012

Я знаю, что уже немного поздно, но я нашел это полезной отправной точкой, поэтому я подумал, что другие тоже могут извлечь пользу из того, что я нашел.

Для небольшого файла, если вы поместите файл 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 (определяется PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__)) в settings.py).Для доступа к этому и методам os вы должны import settings, os в views.py.Если у вас есть это местоположение файла, вы можете вернуть его, используя код ниже:

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 голос
/ 28 октября 2017

Я пытался вернуть словарь в виде файла 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
1 голос
/ 08 августа 2011

Просто скопируйте / свяжите / вызовите код dumpdata, относящийся к сериализации модели, и вставьте его непосредственно в ответ, чтобы избежать проблем с разрешениями и загрязнения файловой системы.Расположение содержимого и mimetype по-прежнему применяются.

В любом случае, помните, что dumpdata может быть длительным процессом, поэтому вы подвержены тайм-аутам.

1 голос
/ 08 августа 2011

ОК, у меня есть:

response = HttpResponse(open(backup_path, "r"), mimetype='application/json', )
response['Content-Disposition'] = "filename=%s" % backup_name"

После сохранения файла на диске я открываю его для чтения и задаю имя файла в ответ.

У кого-нибудь есть другая идея?

0 голосов
/ 08 августа 2011

Мое окончательное решение (благодаря saverio):

response = HttpResponse(mimetype='application/json', )
response['Content-Disposition'] = "filename=%s" % backup_name
sys.stdout = response
call_command('dumpdata')
...