2016-01-13 212 views
2

送達的文件這是我目前有我的定義龍捲風的web服務器:下載龍捲風網絡服務器

application = tornado.web.Application([ 
    tornado.web.url(r"/server", MainHandler), 
    tornado.web.url(r"/(.*)", tornado.web.StaticFileHandler, { "path": scriptpath, "default_filename": "index.html" }), 
]) 

的index.html是一個基於Web的圖形用戶界面的開始頁面。它將通過http:///服務器與後端服務器進行通信,並且gui向服務器發出的請求由MainHandler函數處理。

的目錄結構如下:

root_directory/ 
    server.py 
    fileiwanttodownload.tar.gz 
    index.html 

我希望能夠輸入到瀏覽器:

HTTP:///data/fileiwanttodownload.tar.gz

和將文件作爲常規文件下載發送給我。

我試圖做的是:

application = tornado.web.Application([ 
    tornado.web.url(r"/server", MainHandler), 
    tornado.web.url(r"/data", tornado.web.StaticFileHandler, { "path": scriptpath }), 
    tornado.web.url(r"/(.*)", tornado.web.StaticFileHandler, { "path": scriptpath, "default_filename": "index.html" }), 
]) 

但這不工作的那些可能很明顯,對於誰知道答案的原因。

我唯一的線索是以下錯誤消息:

Uncaught exception GET /data (192.168.4.168) 
HTTPServerRequest(protocol='http', host='192.168.4.195:8888', method='GET', uri='/data', version='HTTP/1.1', remote_ip='192.168.4.168', headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9', 'Host': '192.168.4.195:8888', 'Accept-Encoding': 'gzip, deflate', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Connection': 'keep-alive', 'Accept-Language': 'en-us'}) 
Traceback (most recent call last): 
    File "/usr/local/lib/python3.4/dist-packages/tornado/web.py", line 1445, in _execute 
    result = yield result 
    File "/usr/local/lib/python3.4/dist-packages/tornado/gen.py", line 1008, in run 
    value = future.result() 
    File "/usr/local/lib/python3.4/dist-packages/tornado/concurrent.py", line 232, in result 
    raise_exc_info(self._exc_info) 
    File "<string>", line 3, in raise_exc_info 
    File "/usr/local/lib/python3.4/dist-packages/tornado/gen.py", line 267, in wrapper 
    result = func(*args, **kwargs) 
TypeError: get() missing 1 required positional argument: 'path' 

回答

2

您還沒有表現出scriptpath,很可能是錯誤的。在path中你應該提供根目錄到文件,在URI匹配器中只捕獲文件左右。簡單的例子:

import tornado.ioloop 
import tornado.web 
import os 

class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
     self.write("Hello, world") 

def make_app(): 
    script_path = os.path.dirname(__file__) 
    return tornado.web.Application([ 
     (r"/", MainHandler), 
     (r"/data/(.*)", tornado.web.StaticFileHandler, {"path": script_path}), 
     #  ^we capture only this part 
    ]) 

if __name__ == "__main__": 
    app = make_app() 
    app.listen(8888) 
    tornado.ioloop.IOLoop.current().start() 

正如你可以運行它的工作原理,但建議以靜態/數據文件存儲在單獨的目錄,因爲它可以從應用程序根目錄下載的一切,包括Python之一。

因此,把你的可下載文件,例如在數據子目錄中,然後

script_path = os.path.join(os.path.dirname(__file__), 'data') 

有關更多信息StaticFileHandler

編輯

你所得到的錯誤是因爲在你的代碼/data路由具有StaticFileHandler,但沒有被捕獲來自請求的路徑()

+0

賓果。解決辦法是做「/ data /(.*)」 – ericg