0

我有一个突然停止工作的视图。显然有些东西必须改变,但我不知道是什么。

当视图被调用时,视图应该返回一个 pdf 文件(即 content-disposition 是附件),浏览器尝试下载一个 pdf,但无论如何它总是 0 字节。

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

有人有什么想法吗?

django 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
4

1 回答 1

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配置:

server { 
...
location /xaccel_path {
internal;
alias /path/to/protected/files/;
}
}
于 2013-02-24T11:19:12.887 回答