【问题标题】:Tornado static file routingTornado 静态文件路由
【发布时间】:2016-03-19 15:32:18
【问题描述】:

我正在尝试准备一个默认错误页面。在error.html 文件中我使用:

<link href="css/bootstrap.min.css" rel="stylesheet">

在龙卷风Application 我使用以下路由指令:

(r'/css/(.*)', web.StaticFileHandler, {'path': 'assets/css'}

假设我输入了http://localhost:8888/api url。一切都很好,css 文件加载正确,错误页面渲染得很好。但是,当我键入 http://localhost:8888/api/foo 时,找不到 css 文件。

在第一种情况下,处理程序正确处理了 css 请求 http://localhost:8888/css/bootstrap.min.css。在第二种方法中,对 css 的请求被转换为未处理的http://localhost:8888/api/css/bootstrap.min.css

我希望在这两种情况下都能找到资源以正确显示错误页面。我可以使用:

(r'.*/css/(.*)', web.StaticFileHandler, {'path': 'assets/css'}

但是这次我可以在浏览器中输入http://localhost:8888/api/asdasdsadsad/css/bootstrap.min.css url 并显示 css 文件,而我认为应该显示错误页面。我怎样才能摆脱这个问题?

【问题讨论】:

    标签: html css resources tornado


    【解决方案1】:

    这是因为您使用相对路径。解决此问题的常用方法有两种:

    1. 使用绝对网址。在任何资源之前添加/(斜杠),所以不要使用&lt;link href="css/bootstrap.min.css" rel="stylesheet"&gt;,而是使用&lt;link href="/css/bootstrap.min.css" rel="stylesheet"&gt;

    2. &lt;base&gt; 添加到页面&lt;head&gt; 部分

      Base ... 指定用于文档中包含的所有相对 URL 的基本 URL。

      &lt;base href="http://www.example.com/"&gt;

    并将处理程序保留为

    (r'/css/(.*)', web.StaticFileHandler, {'path': 'assets/css'})
    

    后者之所以有效,是因为它的正则表达式非常广泛,您注意到它处理的请求应该是404。最好的做法是让路线尽可能具体。

    【讨论】:

    • 我之前尝试过您的第一个解决方案,但它不起作用,但现在可以了。感谢您的帮助和第二个示例,这对我来说是新事物。