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

Mar*_*oma 6 python jinja2 flask

我有一个base.html模板,我想用于所有页面.这base.html包含一个导航

<nav>
  <li><a href="./home">Home</a></li>
  <li><a href="./foo">bar</a></li>
</nav>
Run Code Online (Sandbox Code Playgroud)

当我处于同一级别(例如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>
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何获得base_url.如果可能的话,我想避免添加base_url到每个render_template电话.而且,如果可能的话,我也想避免base_url手动设置.

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

Mar*_*ers 9

不要担心基本网址; 如果homefoo在您的应用程序瓶的路线,使用url_for()功能来建立你的网址改为:

<nav>
  <li><a href="{{ url_for('home') }}">Home</a></li>
  <li><a href="{{ url_for('foo') }}">bar</a></li>
</nav>
Run Code Online (Sandbox Code Playgroud)

另请参阅Flask快速入门文档的URL Building部分:

为什么要使用URL反转功能构建URL url_for()而不是将它们硬编码到模板中?

  1. 反向通常比对URL进行硬编码更具描述性.您可以一次更改网址,而无需记住手动更改硬编码网址.
  2. URL构建可以透明地处理特殊字符和Unicode数据的转义.
  3. 如果您的应用程序放在URL根之外,例如,在 /myapplication代替/,url_for()妥善处理,对你.

  • 在某些情况下,您可能需要完整的 URL,例如呈现 HTML 电子邮件模板,其中资产 URL 需要包含您的应用程序主机 URL。 (2认同)