2017-05-20 5 views
-1

サービング私は、次のフラスコのアプリを持っている:バイナリファイル

@app.route('/') 
def serve_index(): 
    return render_template('index.html') 

@app.route('/binary/') 
def serve_binary(): 
    file_name, file_path = generate_binary() 
    return send_file(file_path, attachment_filename = file_name, as_attachment=True) 

私はlocalhost/に行けば予想通り、私はindex.htmlをを取得します。

私がlocalhost/binary/に行くと、私は期待通りにバイナリファイルを取得します。

generate_binary()は、私が書いたバイナリを生成するPythonスクリプトで、Flaskがアクセスできるフォルダに格納し、ファイル名とファイルへのパスを返します)。

ここで、私がlocalhost/binary/にアクセスすると、取得したバイナリをダウンロードできるindex.htmlへのリンクを書きたいと思います。次のように

私のindex.htmlに見えます:私はlocalhost/を訪問し、Link to binaryリンクをクリックした場合

<!DOCTYPE html> 
<html> 
<body> 
<a href="localhost/binary/" target="blank">Link to binary</a> 
</body> 
</html> 

はしかし、私はlocalhost/binary/に着くが、バイナリファイルを取得するために、このページをリロードする必要があります。

私が望むのは、index.htmlページを離れずにファイルを取得することだけです。

+0

'localhost/binary'はまだ完全なURLではなく相対パスです。おそらく 'http:// localhost/binary'を使用するのですか?デフォルトのポート80に移動します。 –

+0

ブラウザに新しいウィンドウを開くように指示しています( 'target =" blank "'のスペルが間違っています。毎回同じウィンドウを再利用します。おそらく '_blank ')。ファイルをダウンロードするために実際に行うべきではありません。 –

+0

'http:// localhost/binary'を使い、' target = "_ blank"を削除すると、そのトリックが実行されました。ありがとうございました! – Pingu

答えて

0

localhost/binaryは、相対パスであり、完全なURLではありません。いずれかを使用します。

  • {{ url_for('serve_binary') }}を - あなたは、絶対パスのみ

次 - ホスト名

  • /binaryと絶対URL - URL
  • http://localhost/binaryを生成するために、フラスコを依頼blankという名前の新しいウィンドウまたはタブでダウンロードを開くようにブラウザに依頼します。これには2つの問題があります。新しい名前のないウィンドウまたはタブを開くための通常の名前は_blank(アンダースコアに注意してください)で、のダウンロードではの場合、全く新しいタブを開きたくありません。そこにtarget="..."属性を削除します。