首页 > 解决方案 > Flask 路由和相对路径

问题描述

我正在使用 Flask 制作网站。它使用 HTML 中的基本模板,用于所有页面。在基本页面(称为base.html)中,有一些对各种静态文件的引用。引用使用相对路径。

这里有几个例子base.html

<link rel="stylesheet" href="../static/css/bootstrap-theme.min.css">
<link rel="stylesheet" href="../static/css/main.css">

只要我不在路由中包含输入参数,而是从这样的请求中获取它们,这就可以正常工作:

@app.route('/person/delete')
def delete_person():
    id = request.args.get('id')
    # some more logic here...

但是,如果我更改路由以包含输入参数,如下所示:

@app.route('/person/delete/<int:id>')
def delete_person(id):
    # some more logic here...

然后我的相对路径将失败。在后一个例子中,我似乎是一个层次。至少我在日志中收到以下错误:

127.0.0.1 - - [2019 年 12 月 29 日 19:20:14] “GET /person/static/css/bootstrap-theme.min.css HTTP/1.1” 404 -
127.0.0.1 - - [2019 年 12 月 29 日19:20:14]“GET /person/static/css/main.css HTTP/1.1”404 -

person部分不应是 URL 的一部分,因为该static文件夹位于根级别。有什么聪明的方法来对付这种行为吗?

注意:我可能会避免在base.html文件中使用相对路径,而只需使用某种指向基本文件夹的快捷方式,但这可能意味着我永远无法使用相对路径。那将是相当可悲的。

标签: pythonflaskroutes

解决方案


如评论中所述,url_for是正确的解决方案。

来自其他项目的示例:

<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='nnn.min.css') }}">

一般来说,url_for不能用硬编码的 URL 代替,甚至不能用绝对 URL 代替,因为整个 Flask 应用程序可能会在其基本 URL 中使用前缀进行部署,例如https://www.example.com/appname. 这appname是配置的一部分,仅在运行时才知道。


推荐阅读