【问题标题】:django response content disappearingdjango响应内容消失
【发布时间】:2013-02-24 05:04:51
【问题描述】:

我有一个视图突然停止工作。显然有些事情一定发生了变化,但我不知道是什么。

视图应该返回一个 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

【问题讨论】:

  • 您的日志中有任何错误消息吗?例如。 /var/log/uwsgi/your-app/var/log/nginx/your-site

标签: django nginx pdf-generation uwsgi pisa


【解决方案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/;
}
}

【讨论】:

  • 天哪,它有效!我从来没有想过将响应对象直接传递给比萨。知道为什么我的原始代码不工作/突然停止工作..?也感谢关于 Nginx X-accel-redirect 的提示!
  • 不知道为什么它突然停止了,尽管我想我曾经有过同样的经历。我认为 NGINX 方法通常更好。很高兴工作成功。
猜你喜欢
  • 2019-04-17
  • 2015-09-18
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多