2016-06-21 87 views
2

我試圖做的工作,我發現在這個URL代碼:http://code.runnable.com/UiIdhKohv5JQAAB6/how-to-download-a-file-generated-on-the-fly-in-flask-for-python從基於瓶的Python服務器上下載文件

我的目標是能夠下載一個網頁瀏覽器的文件時的用戶可以訪問基於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包的最後一個版本,但沒有成功。

如果有人有一個想法,它會很好。

在此先感謝

+0

哪裏可以找到文件系統上的這些文件? – donkopotamus

+0

如果你不動態生成文件,那麼爲什麼不使用'flask.send_file()'? –

+0

即使您動態生成最佳做法,也是將文件保存到磁盤,然後通過Apache或nginx提供,因爲網絡服務器在提供文件比燒瓶更有效率。 –

回答

2

來解決這個問題的最好方法是使用預定義已經助手功能send_file()在燒瓶:

@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)