[英]pdfkit not working when serving flask app with gunicorn and nginx
在开发服务器上,我可以创建一个 pdf 并使用 pdfkit 将其发送给最终用户
我的观点是返回 pdf
@changesBP.route('/pdf', methods=['GET'])
def pdfView():
if not 'dataDict' in session:
flash('Du skal uploade regneark for at kunne fortsætte på siden')
return redirect(url_for('indexBP.indexView'))
balanceChangelist = session['balanceGruppeChanges']
balanceGrupper = balanceData(data = session['dataDict'])
balanceListe = session['balanceListe']
resultatChangelist = session['resultatGruppeChanges']
resultatGrupper = resultatData(data = session['dataDict'])
resultatListe = session['resultatListe']
aendingsLister = []
for bc in balanceChangelist:
for c in bc['changes']:
if c['list'] not in aendingsLister:
aendingsLister.append(c['list'])
for rc in resultatChangelist:
for c in rc['changes']:
if c['list'] not in aendingsLister:
aendingsLister.append(c['list'])
options = {
'page-size': 'Letter',
'margin-top': '0.75in',
'margin-right': '0.75in',
'margin-bottom': '0.75in',
'margin-left': '0.75in',
'encoding': "UTF-8",
'no-outline': None,
'quiet': ''
}
html = render_template('pdfTemplate.html', balanceChangelist = balanceChangelist,
balanceGrupper = balanceGrupper,
balanceListe = balanceListe,
resultatChangelist = resultatChangelist,
resultatGrupper = resultatGrupper,
resultatListe = resultatListe,
aendingsLister = aendingsLister)
out_File = BytesIO()
out_File.write(pdfkit.from_string(html, False, options=options))
out_File.seek(0)
return send_file(out_File,
attachment_filename='out.pdf',
as_attachment=True,
mimetype="application/pdf")
当按照本指南通过 gunicorn 和 Nginx 提供应用程序时,访问 pdf 视图时出现错误的网关错误。
我可以在错误日志上使用一些帮助,说明以下内容
2017/12/13 10:04:39 [错误] 28047#28047: *78 上游提前关闭连接,同时从上游读取响应 header,客户端:10.2.20.180,服务器:10.8.0.12,请求:“GET /pdf HTTP/ 1.1",上游: http://unix:/home/hepo/segesdupont/segesdupont.sock:/pdf ",主机:"10.8.0.12",引用者:" Z80791B3AE7002CB88C246876D9FAA12F8Z.://10.8.0/更改。
有任何想法吗?
此问题的内部错误是“ UnicodeEncodeError:'ascii'编解码器无法在位置193编码字符'\\ xea':序数不在range(128)中”。
您可以通过从用于生成pdf的html中删除所有特殊字符来解决此问题。 使用á代替á。
诊断元素:
可能的问题:服务器上的locale
配置错误。
解决方案:
第1步:尝试观察您的locales
。 在您的终端中输入:
$ locale //DISPLAYING CURRENT SETTINGS
$ locale -a //DISPLAYING AVAILABLE LOCALES
如果您的语言环境定义正确,我想您会在结果中得到一行类似LANG=de_DE.UTF-8
的日耳曼语系的语言...否则,您需要重新配置语言环境 。
步骤2:通过python解释器检查您的locales
:
>>> import locale
>>> locale.getlocale()
>>> locale.getdefaultlocale()
这些命令应该在python上下文中通知您有关locale
的状态。 您还必须在应用程序的特定上下文中查看locale
的状态。
经过检查并最终纠正后,您必须调整用于为应用程序提供服务的脚本。
例如,我使用supervisor
来管理由Nginx + Gunicorn服务的应用程序。 这是我的配置文件,如下所示:
[progam:myapp]
environment=LANG="fr_FR.UTF-8"
// OTHERS COMMANDS...
结论 :
将environment=LANG="de_DE.UTF-8"
行添加到您的配置脚本( init.d
等)中。 或支持您的语言的任何配置; 可能是您的locale system
默认使用的配置
确保您正在转换的 html 模板不包含模板引擎生成的任何链接。 wkhtmltopdf 需要绝对路径。 这是部署到生产服务器时的一个陷阱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.