Python 下载tornado web服务器提供的文件
这是我目前定义tornado web服务器的方式:Python 下载tornado web服务器提供的文件,python,tornado,Python,Tornado,这是我目前定义tornado 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是基于
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的gui的起始页。它将通过以下方式与后端服务器通信:http:///server 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'
未捕获异常获取/数据(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,如Gecko)版本/9.0.2 Safari/601.3.9,“主机”:“192.168.4.195:8888”,“接受编码”:“gzip,deflate”,“接受”:“text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8”,“连接”:“保持活动状态”,“接受语言”:“en-us”})
回溯(最近一次呼叫最后一次):
文件“/usr/local/lib/python3.4/dist-packages/tornado/web.py”,第1445行,在
结果=产量结果
文件“/usr/local/lib/python3.4/dist-packages/tornado/gen.py”,第1008行,正在运行
value=future.result()
文件“/usr/local/lib/python3.4/dist-packages/tornado/concurrent.py”,第232行,在结果中
提升exc信息(自身exc信息)
文件“”,第3行,在raise_exc_信息中
文件“/usr/local/lib/python3.4/dist-packages/tornado/gen.py”,第267行,在包装器中
结果=函数(*args,**kwargs)
TypeError:get()缺少1个必需的位置参数:“path”
脚本路径
您没有显示,可能是错误的。在path
中,您应该为文件提供根目录,在urimatcher中仅捕获文件。简单的例子:
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()
虽然可以运行,但建议将静态/数据文件存储在单独的目录中,因为可以从approot目录下载所有内容,包括python目录
所以把你的可下载文件放在数据子目录中,然后
script_path = os.path.join(os.path.dirname(__file__), 'data')
更多信息
编辑
您得到的错误是因为在代码
/data
中,路由具有StaticFileHandler,但没有从请求的路径捕获任何内容。答对了。解决方案是执行r“/data/(.*)”