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

时间:2017-07-20 07:21:30

标签: python flask jinja2

我有一个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如何解决这个问题?

1 个答案:

答案 0 :(得分:7)

不要担心基本网址;如果homefoo在您的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()构建网址,而不是将其硬编码到模板中?

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