возвращать django HttpResponse в виде файла, а не простого тела ответа внутри сообщения $ .ajax () - PullRequest
2 голосов
/ 03 апреля 2012

Я пытаюсь сгенерировать отчеты и вернуть их запрашивающему клиенту в виде файла:

конец клиента довольно прост:

 $.ajax({
                url: '/reports-get/',
                data: data_to_submit,
                type: 'GET',
                statusCode: {
                    200: function(e){},
                    500: function(e){}
}
            });

Конец сервера:

result = StringIO.StringIO()
pdf = pisa.pisaDocument(StringIO.StringIO(html.encode('UTF-8')), result, encoding='UTF-8', link_callback=fetch_resources)
response = HttpResponse(result.getvalue(), mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename={0}'.format(filename)
result.close()

Я тестирую это с Chrome / FF, и происходит следующее:

Я вижу следующий ответ:

Request URL:http://localhost:8000/reports-get/?csrfmiddlewaretoken=e70579b0ad62d3744133dec4d51c98cc&delivery_type=pdf&report_name=consolidated_report&group_by=managers&projects_to_display=all
Request Method:GET
Status Code:200 OK

и заголовок ответа:

Content-Disposition:attachment; filename=consolidated report 2012-04-03 grouping by managers2012-04-03-02-02.pdf
Content-Encoding:gzip
Content-Length:83312
Content-Type:application/pdf
Date:Mon, 02 Apr 2012 22:02:48 GMT
Server:WSGIServer/0.1 Python/2.7.1
Vary:Accept-Encoding, Cookie

и файл в теле ответа:

%PDF-1.4
%���� ReportLab Generated PDF document http://www.reportlab.com
% 'BasicFonts': class PDFDictionary 
1 0 obj
...
startxref
184036
%%EOF

, но он не сохраняет файл и не запрашивает меня, если я хочу.Я что-то упускаю?

1 Ответ

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

Как только вы запросите это программно, браузер уйдет с пути, или вы получите все виды неприятного поведения. Один из способов сделать так, чтобы это считалось загрузкой, - сформулировать необходимый URL-адрес, а затем задать для него window.location.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...