无法使tornado的静态文件处理器工作

4 投票
3 回答
10185 浏览
提问于 2025-04-17 20:34

为什么这个不管用:

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

你有两种方法可以解决这个错误。

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

撰写回答