2016-05-01 9 views
2

誰かがこれが重複していると言われる前に、私は似たような質問を見て、私を助けなかったからだとは思わない!Python/Flask - ValueError:閉じたファイルに対する入出力操作

私はPythonでFlaskサーバーを作成していますが、私はpdfを示すURLを持つことができる必要があります。これは、私はそれがpdfファイルpdffile.pdfが表示されます/pdfに行くときにそれを作ることになっている

@app.route('/pdf') 
def pdfStuff(): 

     with open('pdffile.pdf', 'rb') as static_file: 
       return send_file(static_file, attachment_filename='pdffile.pdf') 

は、私は次のコードを使用しようとしました。

ValueError: I/O operation on closed file 

どのようにこれが事実である:私は、コードを実行したときに、私はこのエラーを取得するため

しかし、これは動作しませんか?私のreturn文はwith文の中にあるので、ファイルを開いてはいけませんか?

私は通常のstatic_file = open(...)を使用しようとtryfinallyステートメントを使用し、次のように:

static_file = open('pdffile.pdf','rb') 
try: 
     return send_file(static_file, attachment_filename='pdffile.pdf') 
finally: 
     static_file.close() 

同じエラーが上記のコードで起こる、と私はなぜわかりません。誰かが私が間違っていることを知っていますか?

申し訳ありません私はばかだと私は間違いをした何かが簡単です!

ありがとうございます!

+0

コンテキストマネージャは、関数が終了する前にファイルが閉じられることを保証します。ファイルハンドルをそのように戻すことはできません。代わりにファイル名を渡すのはなぜですか? – jonrsharpe

+0

私にそのことを知らせてくれてありがとう!私は今それを試してみるでしょう。 – David

+0

@jonrsharpeニース、それは動作します!私はあなたが実際のファイルの代わりにファイル名の文字列を渡すことができたのか分からなかった。どうもありがとうございました! – David

答えて

1

ファイル名にsend_fileを使用すると、期待通りの結果が得られます。

@app.route('/pdf') 
def pdfStuff(): 
    return send_file('pdffile.pdf') 
関連する問題