无法使tornado的静态文件处理器工作
为什么这个不管用:
application = tornado.web.Application([(r"/upload.html",tornado.web.StaticFileHandler,\
{"path":r"../web/upload.html"}),])
if __name__ == "__main__":
print "listening"
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8888)
tornado.ioloop.IOLoop.instance().start()
出错了
http://localhost:8888/upload.html throws:
TypeError: get() takes at least 2 arguments (1 given)
ERROR:tornado.access:500 GET /upload.html (::1) 6.47ms
我在网上搜索过,但感觉我的用法完全正确。 所以我找不到它为什么不工作的原因。网上大多数例子都是给整个目录设置一个固定的处理程序。那么,是不是说,它不适用于单个文件呢?
3 个回答
0
试试这个:
application = tornado.web.Application([(r"/upload.html",tornado.web.StaticFileHandler,\
{"path":r"../web"},'default_filename':'upload.html'),])
3
StaticFileHandler
通常用来提供一个文件夹里的文件,因此它需要一个路径作为参数。从文档中可以了解到:
注意,正则表达式中的捕获组是必须的,用来解析传给
get()
方法的路径参数(这和上面构造函数的参数不同);具体细节请查看 URLSpec。
例如:
urls = [(r"/(.*)", tornado.web.StaticFileHandler, {"path": "../web"})]
application = tornado.web.Application(urls)
这段代码会提供 ../web 文件夹里的所有文件,包括 upload.html。
6
你有两种方法可以解决这个错误。
把
../web/
目录下的所有文件都添加进来。Tornado不支持单独处理文件。application = tornado.web.Application([(r"/(.*)", \ tornado.web.StaticFileHandler, \ {"path":r"../web/"}),])
你可以通过传入一个文件来渲染HTML。你需要为每个HTML文件创建一个处理器。
import tornado.web import tornado.httpserver class Application(tornado.web.Application): def __init__(self): handlers = [ (r"/upload.html", MainHandler) ] settings = { "template_path": "../web/", } tornado.web.Application.__init__(self, handlers, **settings) class MainHandler(tornado.web.RequestHandler): def get(self): self.render("upload.html") def main(): applicaton = Application() http_server = tornado.httpserver.HTTPServer(applicaton) http_server.listen(8888) tornado.ioloop.IOLoop.instance().start() if __name__ == "__main__": main()