2013-02-24 89 views
0

我有一个视图,突然停止工作。显然有些事情必须改变,但我不知道是什么。django响应内容消失

该视图应该返回一个pdf文件(即content-disposition是附件) 当调用视图时,浏览器试图下载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 
+0

在你的日志中的任何错误讯息?例如。 '/ var/log/uwsgi/your-app'或'/ var/log/nginx/your-site' – Ric 2013-02-24 05:10:38

回答

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/; 
} 
} 
+0

HOLY CRAP它的工作原理!我从未想过将响应对象直接传递给比萨。任何想法为什么我原来的代码不工作/突然停止工作..? 也感谢关于Nginx X-accel-redirect的提示! – 2013-02-24 19:18:58

+0

没有强烈的想法,为什么它突然停止,但我认为我曾经有过相同的经历。我觉得NGINX方法一般更好。快乐的工作。 – 2013-02-25 09:52:14