我正在使用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--[29 / Dec / 2019 19:20:14]“ GET /person/static/css/bootstrap-theme.min.css HTTP / 1.1” 404-
127.0.0.1--[29 / Dec / 2019 19:20:14]“ GET /person/static/css/main.css HTTP / 1.1” 404-
person
部分不应是URL的一部分,因为static
文件夹位于根级别。有什么聪明的方法来应对这种行为?
注意:我可能可以避免使用base.html
文件中的相对路径,而只是使用某种指向基本文件夹的快捷方式,但这可能意味着我永远无法使用相对路径。那就太可悲了。
答案 0 :(得分:1)
如评论中所述,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
是配置的一部分,只有在运行时才知道。