我有一个简单的Django
应用,它位于Nginx
后面。我使用weasyprint
制作PDF报告。 weasyprint
需要base_url
属性才能访问static
个文件。
虽然以下django
代码在本地计算机上工作正常(在dev服务器下),但在Nginx后面发布时会出现 502 Bad Gateway 错误。
html = render_to_string('admin/enquiry/quoterequest/generate.html', {'enquiry': enquiry})
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'filename=\"Enquiry_{}.pdf'.format(enquiry.reference)
weasyprint.HTML(string=html,base_url=request.build_absolute_uri()).write_pdf(response, stylesheets=[
weasyprint.CSS(settings.STATICFILES_DIRS[0] + '/css/print.css')])
如果删除base_url
属性,上面的代码可以正常工作(不打印图像)。非常感谢您的输入 - 如何设置nginx
或从Django中恢复base_url
# configuration of the server
server {
listen 80;
server_name 192.168.33.10; # Vagrant IP
root /home/www/my_project;
charset utf-8;
client_max_body_size 75M; # max upload size
location /media {
alias /home/www/my_project/assets/uploads;
}
location /static {
alias /home/www/my_project/assets/static;
}
location / {
proxy_pass http://localhost:8001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
@page {
size: letter;
margin: 1.5in .25in 1.9in .5in;
@top-center {
content: url("/uploads/header_footer/header.jpg");
height: 100%;
width: 100%;
}
@bottom-center {
background-image: url("/uploads/header_footer/footer.jpg");
background-repeat: no-repeat;
background-position: center;
content: "Page " counter(page);
height: 100%;
width: 100%;
vertical-align: bottom;;
}
}
这是来自nginx
日志的错误消息。
upstream prematurely closed connection while reading response header from upstream, client: 192.168.33.1, server: 192.168.33.10, request: "GET /enquiry/admin/enquiry/quoterequest/view/1/ HTTP/1.1", upstream: "http://127.0.0.1:8001/enquiry/admin/enquiry/quoterequest/view/1/", host: "192.168.33.10", referrer: "http://192.168.33.10/admin/enquiry/quoterequest/"
答案 0 :(得分:1)
回答我自己 - 但这是一种解决方法'。对于ip 192.168.33.10 ,并且对于它的基地址http://192.168.33.10/media/'
base_url parameter for
weasyprint`仍然存在问题 - 即使手动输入基地址也不行。< / p>
这仍然不起作用并返回502 Bad Gateway
weasyprint.HTML(string=html, base_url='http://192.168.33.10/media/').write_pdf(response)
所以我决定改变template
。所以无论我在哪里定义URL,我都将它们改为......
<img src="http://{{ request.META.HTTP_HOST }}{{ MEDIA_URL }}{{ myapp.mymodel.my_image }}">
并在我的context_instance
中添加View.py
以获取MEDIA_URL
。希望有人会为weasyprint
的{{1}}问题找到答案。
base_url
答案 1 :(得分:0)
我在WeasyPrint上遇到了类似的问题,发现base_url
仅被考虑到if URLs are not absolute。
我的解决方法是,如果上下文中包含真实的absolute_paths
,则制作一个custom Django template tag将其转换为文件系统的绝对路径。同时I posted a question about my own problem scenario。
希望这会有所帮助!