Jinja语法

变量

使用{{ name }}结构表示一个变量,是一个特殊的占位符,告诉模板引擎这个位置的值从渲染模板时使用的数据中获取

  1. <p> hello {{ name }} </p>
  2. <p> value from dicretory {{ dict['key'] }} </p>
  3. <p> value from list hello {{ list[index] }} </p>
  4. <p> value from obj's method {{ obj.method() }} </p>
  5. <p> value {{ name|{filter_name} }} </p>

变量过滤器

过滤器名 说明
safe 渲染时不转义
capitalize 首字母转换成大写,其余转换成小写
lower 值转换成小写形式
upper 值转换成大写形式
title 值中每个单词首字母都转换成大写
trim 去除首尾空格
striptags 渲染前把值中所有html标签都删除

控制结构

条件判断

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>User</title>
  6. </head>
  7. <body>
  8. {% if name=="tao" %}
  9. <h1 style="color:red">Hello, {{name}}</h1>
  10. {% elif name=="tao2" %}
  11. <h1 style="color:green">Hello, 2, {{name}}</h1>
  12. {% else %}
  13. <h1> Hello Stranger!</h1>
  14. {% endif %}
  15. </body>
  16. </html>

for循环

  1. <ul>
  2. {% for item in items %}
  3. <li> {{ item }} </li>
  4. {% endfor %}
  5. </ul>

宏macro

类似于python中的函数
macros.html

  1. // 定义宏
  2. {% macro render_item(item) %}
  3. <li> {{ item }} </li>
  4. {% endmacro %}
  5. // 使用宏
  6. <ul>
  7. {% for item in items %}
  8. {{ render_item(item) }}
  9. {% endfor %}
  10. </ul>

为了重复使用宏,把宏保存在单独文件中,在需要使用模板的时候导入

  1. {% import "macros.html" as macros %}
  2. <!--导入后使用-->
  3. <ul>
  4. {% for item in items %}
  5. {{ macros.render_item(item) }}
  6. {% endfor %}
  7. </ul>

引入include

需要在多处重复使用的模板代码片段可单独写入一个文件,在需要的地方引入,避免重复。
整合重复使用的模板代码片段
template.html

  1. <h1>hello world</h1>

index.html
在需要的地方使用引入代码块

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>index</title>
  6. </head>
  7. <body>
  8. <h1 style="color:red">Hello World!</h1>
  9. {% include "template.html" %}
  10. </body>
  11. </html>

资源加载、模板渲染 - 图1

模板继承

另一种重复使用代码的方式是模板继承,类似于python代码的继承
定义一个基模板,基模板定义的区块(block)可在衍生模板中覆盖

  1. <html>
  2. <head>
  3. {% block %}
  4. <title>{% block title %} {% endblock %} 测试</title>
  5. {% endblock %}
  6. </head>
  7. <body>
  8. {% block body %}
  9. <h1>base body</h1>
  10. {% endblock %}
  11. </body>
  12. </html>

衍生模板
index.html

  1. {% extends "base.html" %}
  2. {% block title %} new {% endblock %}
  3. <body>
  4. {% block body %}
  5. <div>index body</div>
  6. {{ super() }}
  7. {% endblock %}
  8. </body>

使用 {% extends %} 命令来继承某个模板
衍生模板中,相同区块内容会覆盖基模板数据,若想使用基模板数据,使用 {{ super() }}
资源加载、模板渲染 - 图2

Flask-bootstrap

Bootstrap是Twitter开发的一个开源Web框架,它提供的用户界面组件可用于创建整洁且有吸引力的页面。
要想在应用中集成Bootstrap,可参照其文档针对模板进行改动,这个任务可使用Flask拓展完成。

安装与使用

  • 安装: pip install flask-bootstrap
  • 使用
    • 初始化Flask-Bootstrap (hello.py),就可以在应用中使用一个包含Bootstrap的文件和一般结构的基模板 ```python from flask import Flask from flask_bootstrap import Bootstrap

app = Flask(name) bootstrap = Bootstrap(app)

  1. - 模板修改
  2. user.html
  3. ```html
  4. {% extends "bootstrap/base.html" %}
  5. {% block title %}Flasky{% endblock %}
  6. {% block navbar %}
  7. <div class="navbar navbar-inverse" role="navigation">
  8. <div class="container">
  9. <div class="navbar-header">
  10. <button type="button" class="navbar-toggle"
  11. data-toggle="collapse" data-target=".navbar-collapse">
  12. <span class="sr-only">Toggle navigation</span>
  13. <span class="icon-bar"></span>
  14. <span class="icon-bar"></span>
  15. <span class="icon-bar"></span>
  16. </button>
  17. <a class="navbar-brand" href="/">Flasky</a>
  18. </div>
  19. <div class="navbar-collapse collapse">
  20. <ul class="nav navbar-nav">
  21. <li><a href="/">Home</a></li>
  22. </ul>
  23. </div>
  24. </div>
  25. </div>
  26. {% endblock %} {% block content %}
  27. <div class="container">
  28. <div class="page-header">
  29. <h1>Hello, {{ name }}!</h1>
  30. </div>
  31. </div>
  32. {% endblock %}

flask-bootstrap定义的区块

区块名 说明
doc 整个html文档
html_attribs 标签的属性
html 标签中的内容
head 标签中的内容
title 标签中的内容</td> </tr> <tr> <td>metas</td> <td>一组metas标签</td> </tr> <tr> <td>styles</td> <td>css声明</td> </tr> <tr> <td>body_attribs</td> <td><body>标签的属性</td> </tr> <tr> <td>body</td> <td><body>标签中的内容</td> </tr> <tr> <td>navbar</td> <td>用户定义的导航栏</td> </tr> <tr> <td>content</td> <td>用户定义的页面内容</td> </tr> <tr> <td>scripts</td> <td>文档底部的JavaScript内容</td> </tr> </tbody> </table> <p>很多区块都是Bootstrap自用的,直接覆盖可能会出现问题,可使用<strong>super()</strong>后添加自定义内容</p> <pre><code class="lang-html">{% extends "bootstrap/base.html %} {% block scripts %} {{ super() }} <script type="text/javascript" src="my-script.js"></script> {% endblock %} </code></pre> <p><a name="Z3dUh"></a></p> <h1 id="7bb9cz"><a name="7bb9cz" class="reference-link"></a><span class="header-link octicon octicon-link"></span>链接</h1><p><a name="wKuAD"></a></p> <h2 id="3dhiq6"><a name="3dhiq6" class="reference-link"></a><span class="header-link octicon octicon-link"></span>根据视图函数获取URL</h2><p><strong>url_for()</strong>最简单的方法是,以视图函数名作为参数,返回对应的URL</p> <pre><code class="lang-python">@app.route("/user/<name>") def user(name): return render_template("user.html") </code></pre> <ul> <li><p>相对地址,默认</p> <pre><code class="lang-python">url_for('index') # "/" </code></pre> </li><li><p>绝对地址,需要增加_external=True</p> <pre><code class="lang-python">url_for('index', _external=True) # "http://localhost:5000/" </code></pre> </li><li><p>动态路由参数、非动态路由参数</p> <pre><code class="lang-python">url_for('user', name="test", _external=True) # "http://localhost:5000/user/test" url_for('user', name="test", page=2, version=1) "/user/test?page=2&version=1" </code></pre> <p><a name="HbJ5Y"></a></p> <h2 id="sv6v2"><a name="sv6v2" class="reference-link"></a><span class="header-link octicon octicon-link"></span>静态文件</h2><p>Web 程序不是仅由 Python 代码和模板组成。大多数程序还会使用静态文件,例如 HTML代码中引用的图片、JavaScript 源码文件和 CSS。</p> <pre><code class="lang-python"># http://localhost:5000/static/css/styles.css url_for('static', filename='css/styles.css', _external=True) url_for('static', filename = 'favicon.ico') # /static/favicon.ico </code></pre> <p>base.html</p> <pre><code class="lang-python">{% extends "bootstrap/base.html" %} {% block head %} {{ super() }} <link rel="shortcut icon" href="{{ url_for('static', filename = 'favicon.ico') }}" type="image/x-icon"> <link rel="icon" href="{{ url_for('static', filename = 'favicon.ico') }}" type="image/x-icon"> {% endblock %} </code></pre> </li></ul>