Содержимое ответа django исчезает

У меня представление, которое внезапно перестало работать. Очевидно, что-то должно было измениться, но я понятия не имею, что.

представление должно возвращать pdf-файл (т. е. content-disposition является вложением), когда представление вызывается, браузер пытается загрузить pdf-файл, но независимо от того, что это всегда 0 байт.

Я регистрируюсь здесь и там, чтобы отладить проблему. Я вижу, что когда объект ответа возвращается из generate_pdf, он имеет правильное содержимое. Как-то между там и клиентским браузером он просто пропадает.

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

джанго 1.3, nginx, uwsgi

просмотры.py

def get(self, request, *args, **kwargs):
    ...
    return generate_pdf(request, 'ps_pdfbase.html', context_dict, returned_file_name)

функция generate_pdf

...
myfile = StringIO()
result_obj = pisa.CreatePDF(file_data, myfile)

logging.debug('pdf result_obj:\n\tsize:%s\n\terr:%s\n\tlog:%s\n\ttext:%s' % (myfile.tell(),
                                                                                result_obj.err,
                                                                                result_obj.log,
                                                                                result_obj.text, )) 
myfile.seek(0)
response =  HttpResponse(myfile, mimetype='application/pdf')    
logging.debug('response content: %s' % response.content)
response['Content-Disposition'] = 'attachment; filename=' + slugify(returned_file_name) + '.pdf'
return response

person w--    schedule 24.02.2013    source источник
comment
Какие-нибудь сообщения об ошибках в ваших журналах? Например. /var/log/uwsgi/your-app или /var/log/nginx/your-site   -  person Ric    schedule 24.02.2013


Ответы (1)


В качестве альтернативного подхода попробуйте создать ответ, а затем передать его непосредственно в pisa?

response = http.HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=%s' % filename
pisa.CreatePDF(file_data, response) 
return response

Вы решили не сохранять файл и не обслуживать его через Nginx X-Accel-Redirect? - Просто для полноты вот пример этого:

Джанго вид:

resp = http.HttpResponse()
resp['Content-Type'] = 'application/pdf'
resp['Content-Disposition'] = 'attachment; filename=filename.pdf'
resp['X-Accel-Redirect'] = '/xaccel_path/%s' % relative_path_to_file
return resp

конфиг нгинкс:

server { 
...
location /xaccel_path {
internal;
alias /path/to/protected/files/;
}
}
person Ben Eliott    schedule 24.02.2013
comment
СВЯТАЯ ДЕРЬМО это работает! Я бы никогда не подумал о передаче объекта ответа непосредственно в pisa. Любая идея, почему мой исходный код не работал/внезапно перестал работать..? Также спасибо за совет о Nginx X-accel-redirect! - person w--; 24.02.2013
comment
Не знаю, почему он внезапно остановился, хотя я думаю, что однажды у меня был такой же опыт. Метод NGINX вообще лучше я думаю. Рад, что сработало. - person Ben Eliott; 25.02.2013