使用gunicorn和nginx提供Flask应用程序时,pdfkit不工作

2024-10-02 22:23:16 发布

您现在位置:Python中文网/ 问答频道 /正文

在开发服务器上,我可以创建一个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在this guide提供应用程序时,我在访问pdf视图时遇到了一个错误的网关错误。

我可以在错误日志中提供一些帮助

2017/12/13 10:04:39 [error] 28047#28047: *78 upstream prematurely closed connection while reading response header from upstream, client: 10.2.20.180, server: 10.8.0.12, request: "GET /pdf HTTP/1.1", upstream: http://unix:/home/hepo/segesdupont/segesdupont.sock:/pdf", host: "10.8.0.12", referrer: "http://10.8.0.12/changes"

有什么想法吗?


Tags: inmarginforifpdfsessionnotout
2条回答

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

您只需从用于生成pdf的html中删除任何特殊字符就可以解决这个问题。用“啊”代替“啊”。在

诊断要素:

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

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

解决方案:

第一步:试着看你的locales。在您的终端类型中:

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

如果您的区域设置定义得很好,我想在您得到的结果中,对于日耳曼语言中的系统,会有一行类似LANG=de_DE.UTF-8。。。否则您需要to reconfigure your locales。在

第2步:通过python解释器检查locales

^{pr2}$

这些命令应该通知您在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默认使用的配置

相关问题 更多 >