使用gunicorn和nginx时,pdfkit无法正常工作

时间:2017-12-13 09:30:15

标签: python nginx flask gunicorn pdfkit

在开发服务器上,我可以创建一个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")

this guide之后通过gunicorn和Nginx提供应用程序时,访问pdf视图时出现错误的网关错误。

我可以在错误日志上使用一些帮助来说明以下内容

  

2017/12/13 10:04:39 [错误] 28047#28047:* 78上游过早   从上游读取响应头时关闭连接,客户端:   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",推荐人:" http://10.8.0.12/changes"

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

此问题的内部错误是“ UnicodeEncodeError:'ascii'编解码器无法在位置193编码字符'\ xea':序数不在范围(128)中”。

您可以通过从用于生成pdf的html中删除所有特殊字符来解决此问题。使用á代替á。

答案 1 :(得分:0)

诊断元素:

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

可能的问题:  服务器上的locale配置错误。

解决方案:

步骤1:尝试观看您的locales。在您的终端中输入:

$ locale  //DISPLAYING CURRENT SETTINGS 
$ locale -a  //DISPLAYING AVAILABLE LOCALES

如果您对语言环境进行了很好的定义,那么我想在结果中您会得到一条像LANG=de_DE.UTF-8这样的行,用于日耳曼语系的系统...否则,您需要to reconfigure your locales

步骤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

默认使用的配置