2016-06-21 15 views
2

からファイルをダウンロードします。http://code.runnable.com/UiIdhKohv5JQAAB6/how-to-download-a-file-generated-on-the-fly-in-flask-for-pythonは、私は、次のURLで確認作業のコードを作成しようとしているフラスコベースのPythonサーバー

私の目標は、ときに、Webブラウザ上でファイルをダウンロードできるようにすることですFlaskベースのPythonサーバー上のWebサービスへのユーザーアクセス。

だから私は、次のコードを書いた:

@app.route("/api/downloadlogfile/<path>") 
def DownloadLogFile (path = None): 
    if path is None: 
     self.Error(400) 

    try: 
     with open(path, 'r') as f: 
      response = make_response(f.read()) 
     response.headers["Content-Disposition"] = "attachment; filename=%s" % path.split("/")[2] 

     return response 
    except Exception as e: 
     self.log.exception(e) 
     self.Error(400) 

をしかし、このコードが動作するようには思えません。

Traceback (most recent call last): 
File "C:\Python27\lib\site-packages\gevent\pywsgi.py", line 508, in handle_one_response 
self.run_application() 
File "C:\Python27\lib\site-packages\geventwebsocket\handler.py", line 88, in run_application 
return super(WebSocketHandler, self).run_application() 
File "C:\Python27\lib\site-packages\gevent\pywsgi.py", line 495, in run_application 
self.process_result() 
File "C:\Python27\lib\site-packages\gevent\pywsgi.py", line 484, in process_result 
for data in self.result: 
File "C:\Python27\lib\site-packages\werkzeug\wsgi.py", line 703, in __next__ 
return self._next() 
File "C:\Python27\lib\site-packages\werkzeug\wrappers.py", line 81, in _iter_encoded 
for item in iterable: 
TypeError: 'Response' object is not iterable 

私は最後のバージョンではなく、成功せず、私のフラスコとWERKZEUGパッケージを更新:確かに私は修正するために管理していなかったエラーを取得します。

誰かがアイデアを持っているなら、それはすばらしいでしょう。この問題を解決する最良の方法は、フラスコ内ですでに定義済みのヘルパー関数send_file()を使用することです事前

+0

? – donkopotamus

+0

ファイルを動的に生成していない場合は、 'flask.send_file()'を使わないのはなぜですか? –

+0

ベストプラクティスを動的に生成していても、ファイルをディスクに保存してから、Webサーバーがフラスコよりもはるかに効率的にファイルを処理できるため、Apacheまたはnginxを使用してファイルを提供します。 –

答えて

2

ありがとう:これらのファイルは、ファイル・システム上にある

@app.route("/api/downloadlogfile/<path>") 
def DownloadLogFile (path = None): 
    if path is None: 
     self.Error(400) 
    try: 
     return send_file(path, as_attachment=True) 
    except Exception as e: 
     self.log.exception(e) 
     self.Error(400) 
関連する問題