不能让tornado staticfilehandler工作

时间:2014-03-03 05:20:03

标签: python 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 :(得分:4)

您有两种方法可以解决此错误。

  1. 添加../web/目录的所有文件。 Tornado不处理单个文件。

    application = tornado.web.Application([(r"/(.*)", \
                                           tornado.web.StaticFileHandler, \
                                           {"path":r"../web/"}),]) 
    
  2. 您可以渲染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() 
    

答案 1 :(得分:3)

StaticFileHandler通常用于提供目录,因此它希望接收路径参数。来自the docs

  

请注意,正则表达式中的捕获组需要解析该值   用于get()方法的path参数(不同于   上面的构造函数参数);有关详细信息,请参阅URLSpec。

e.g。

urls = [(r"/(.*)", tornado.web.StaticFileHandler, {"path": "../web"})]
application = tornado.web.Application(urls)

将为../web中的每个文件提供服务,包括upload.html。

答案 2 :(得分:0)

尝试一下:

application = tornado.web.Application([(r"/upload.html",tornado.web.StaticFileHandler,\
                                   {"path":r"../web"},'default_filename':'upload.html'),])