如何使用Flask / Jinja2获取基本URL?

13

我有一个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。如果可能的话,我想避免在每个render_template调用中添加base_url。并且,如果可能的话,我也想避免手动设置base_url

如何使用Flask / Jinja2解决这个问题?

2个回答

19

不必担心基础URL;如果homefoo是您的Flask应用程序中的路由,请使用url_for()函数构建您的URL:

<nav>
  <li><a href="{{ url_for('home') }}">Home</a></li>
  <li><a href="{{ url_for('foo') }}">bar</a></li>
</nav>

请参阅 Flask Quickstart 文档中的 URL 构建部分

为什么要使用 URL 反转函数 url_for() 来构建 URL,而不是在模板中硬编码?

  1. 反转 URL 通常比硬编��� URL 更加描述性。 您可以一次性更改 URL 而无需记住手动更改硬编码的 URL。
  2. 您可以一次性更改 URL 而无需记住手动更改硬编码的 URL。
  3. URL 构建会自动透明地处理特殊字符和 Unicode 数据的转义。
  4. 生成的路径始终是绝对路径,避免了浏览器中相对路径的意外行为。
  5. 如果您的应用程序位于 URL 根目录之外,例如在 /myapplication 而不是 / 中,url_for() 会正确处理这一点。

2
有些情况下你可能需要完整的URL,例如渲染HTML电子邮件模板时,其中资源URL需要包含你的应用程序主机URL。 - kontur
1
@kontur:当然,然后您仍将使用url_for(),并使用_external=True参数获取完整的URL。 - Martijn Pieters

0
如果您在base.html中有像meta、navbar等元素,希望在站点的所有页面上显示,您可以在每个新页面的顶部键入此内容。
{% extends "base.html" %}
{% block content %}
    <!-- write page specific html between here -->  
{% endblock %}

把它放在正确的位置很重要

{% block content %} 
{% endblock %}

在你的base.html文件中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接