我有一个base.html
模板,我想用于所有页面。此base.html
包含导航
<nav>
<li><a href="./home">Home</a></li>
<li><a href="./foo">bar</a></li>
</nav>
当我在同一级别(例如localhost:5000/whatever
)时,这没有问题,但是当我在子文件夹中(例如localhost:5000/whatever/insert
)时,链接会中断。
这可以通过使相对链接绝对来解决,例如
<nav>
<li><a href="{{base_url}}/home">Home</a></li>
<li><a href="{{base_url}}/foo">bar</a></li>
</nav>
但是,我不知道如何获得base_url
。如果可能,我希望避免在每个base_url
电话中添加render_template
。并且,如果可能的话,我还想避免手动设置base_url
。
Flask / Jinja2如何解决这个问题?
答案 0 :(得分:7)
不要担心基本网址;如果home
和foo
在您的Flask应用中是路线,请使用url_for()
function来构建您的网址:
<nav>
<li><a href="{{ url_for('home') }}">Home</a></li>
<li><a href="{{ url_for('foo') }}">bar</a></li>
</nav>
另请参阅Flask快速入门文档的URL Building section:
为什么要使用网址反转功能
url_for()
构建网址,而不是将其硬编码到模板中?
- 反转通常比对网址进行硬编码更具描述性。 您可以一次性更改网址,而无需记住 手动更改硬编码的URL。
- 您可以一次性更改网址,而无需记住手动更改硬编码网址
- URL构建处理特殊字符和Unicode数据的转义 透明。
- 生成的路径始终是绝对的,避免了浏览器中相对路径的意外行为。
- 如果您的应用程序位于URL根目录之外,例如,位于
醇>/myapplication
而不是/
,url_for()
正确地为您处理。