11

以下のコードではエラーが発生します。

Traceback (most recent call last):
  File "pdf.py", line 14, in <module>
    create_pdf(render_template('templates.htm'))
  File "/usr/local/lib/python2.7/dist-packages/flask/templating.py", line 123, in render_template
    ctx.app.update_template_context(context)
AttributeError: 'NoneType' object has no attribute 'app'

コード:

from xhtml2pdf import pisa
from StringIO import StringIO
from flask import render_template,Flask

app=Flask(__name__)
app.debug=True

@app.route("/")
def create_pdf(pdf_data):
        filename= "file.pdf"
        pdf=pisa.CreatePDF( StringIO(pdf_data),file(filename, "wb"))

if __name__ == "__main__":
        create_pdf(render_template('templates.htm'))
4

5 に答える 5

13

Flask は多くの「マジック」を実行するため、リクエストのルーティングや解析について心配する必要はありません。Flask アプリケーションは、リクエストを受け取ると、ビュー関数にロジックを委譲する前に「コンテキスト」オブジェクトを作成します。

コードでは、render_templateFlask を経由せずに直接呼び出しているため、コンテキストは作成されません。このコンテキスト ( ) を介してアプリケーション ( ) にアクセスしよrender_templateうとするため、エラーが発生します。appctxNone

AttributeError: 'NoneType' object has no attribute 'app'

コードの問題はこれだけではありません。ビュー関数 (decorator に登録されている@app.route(...)) は、直接呼び出されることを意図していません。@rajpy の回答は、それらの使用方法の良い例を示しています。

于 2013-06-20T08:48:01.790 に答える
6

コードから、ユーザーが pdf をダウンロードできるようにしたいことがわかります。

from xhtml2pdf import pisa
from StringIO import StringIO
from flask import render_template,Flask, Response

app=Flask(__name__)
app.debug=True

@app.route("/")
def create_pdf(pdf_data):
        filename= "file.pdf"
        pdf=pisa.CreatePDF( StringIO(pdf_data),file(filename, "wb"))
        return Response(pdf, mimetype='application/octet-stream',
                        headers={"Content-Disposition": "attachment;filename=%s" % filename})

if __name__ == "__main__":
        app.run()

さあ、走ってpython aboveprogram.py

に行くhttp://localhost:5000

ブラウザーは PDF をダウンロードするようにプロンプ​​トを出します。

于 2013-06-20T07:04:18.687 に答える