繁体   English   中英

使用 gunicorn 和 nginx 提供 flask 应用程序时,pdfkit 无法正常工作

[英]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中删除所有特殊字符来解决此问题。 使用á代替á。

诊断元素:

  • 在开发服务器上时,将正确生成文件。
  • 当您落后于nginx时,它将不再起作用。
  • 您的文件包含重音字符。

可能的问题:服务器上的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM