django响应内容消失

时间:2013-02-24 05:04:52

标签: django nginx pdf-generation uwsgi pisa

我有一个突然停止工作的观点。显然有些事情必须改变,但我不知道是什么。

视图应该返回一个pdf文件(即内容处置是附件) 当调用视图时,浏览器会尝试下载pdf,但无论它总是0字节。

我在这里和那里记录调试问题所在。我可以看到,当从generate_pdf返回响应对象时,它具有正确的内容。不知怎的,在那里和客户端浏览器之间,它就会消失。

有人有什么想法吗?

django 1.3,nginx,uwsgi

views.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

1 个答案:

答案 0 :(得分:1)

正如一种替代方法尝试创建响应,然后将其直接传递给比萨?

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

您决定不通过Nginx X-Accel-Redirect保存文件并提供服务吗? - 为了完整起见,这是一个例子:

Django观点:

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

nginx config:

server { 
...
location /xaccel_path {
internal;
alias /path/to/protected/files/;
}
}