3.4 控制语句
常用的几种控制语句:
模板中的if控制语句
@app.route('/user')
def user():
    user = 'dongGe'
    return render_template('user.html',user=user)<html>
 <head>
     {% if user %}
        <title> hello {{user}} </title>
    {% else %}
         <title> welcome to flask </title>        
    {% endif %}
 </head>
 <body>
     <h1>hello world</h1>
 </body>
 </html>模板中的for循环语句
@app.route('/loop')
 def loop():
    fruit = ['apple','orange','pear','grape']
    return render_template('loop.html',fruit=fruit)<html>
 <head>
     {% if user %}
        <title> hello {{user}} </title>
    {% else %}
         <title> welcome to flask </title>        
    {% endif %}
 </head>
 <body>
     <h1>hello world</h1>
    <ul>
        {% for index in fruit %}
            <li>{{ index }}</li>
        {% endfor %}
    </ul>
 </body>
 </html>
3.5 宏、继承、包含
类似于python中的函数,宏的作用就是在模板中重复利用代码,避免代码冗余。
Jinja2支持宏,还可以导入宏,需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免重复。
定义宏
{% macro input() %}
  <input type="text"
         name="username"
         value=""
         size="30"/>
{% endmacro %}调用宏
{{ input() }}定义带参数的宏
{% macro input(name,value='',type='text',size=20) %}
    <input type="{{ type }}"
           name="{{ name }}"
           value="{{ value }}"
           size="{{ size }}"/>
{% endmacro %}调用宏,并传递参数
{{ input(value='name',type='password',size=40)}}把宏单独抽取出来,封装成html文件,其它模板中导入使用
文件名可以自定义macro.html
{% macro function() %}
    <input type="text" name="username" placeholde="Username">
    <input type="password" name="password" placeholde="Password">
    <input type="submit">
{% endmacro %}在其它模板文件中先导入,再调用
{% import 'macro.html' as func %}
{% func.function() %}模板继承:
模板继承是为了重用模板中的公共内容。一般Web开发中,继承主要使用在网站的顶部菜单、底部。这些内容可以定义在父模板中,子模板直接继承,而不需要重复书写。
{% block top %}``{% endblock %}标签定义的内容,相当于在父模板中挖个坑,当子模板继承父模板时,可以进行填充。
子模板使用extends指令声明这个模板继承自哪?父模板中定义的块在子模板中被重新定义,在子模板中调用父模板的内容可以使用super()。
父模板:base.html
{% block top %}
    顶部菜单
  {% endblock top %}
  {% block content %}
  {% endblock content %}
  {% block bottom %}
    底部
  {% endblock bottom %}子模板:
{% extends 'base.html' %}
  {% block content %}
   需要填充的内容
  {% endblock content %}- 模板继承使用时注意点:
 
- 不支持多继承。
 - 为了便于阅读,在子模板中使用extends时,尽量写在模板的第一行。
 - 不能在一个模板文件中定义多个相同名字的block标签。
 - 当在页面中使用多个block标签时,建议给结束标签起个名字,当多个block嵌套时,阅读性更好。
 
包含(Include)
Jinja2模板中,除了宏和继承,还支持一种代码重用的功能,叫包含(Include)。它的功能是将另一个模板整个加载到当前模板中,并直接渲染。
示例:
include的使用
{\% include 'hello.html' %}
包含在使用时,如果包含的模板文件不存在时,程序会抛出TemplateNotFound异常,可以加上ignore missing关键字。如果包含的模板文件不存在,会忽略这条include语句。
示例:
include的使用加上关键字ignore missing
{\% include 'hello.html' ignore missing %}
- 宏、继承、包含:
 
- 宏(Macro)、继承(Block)、包含(include)均能实现代码的复用。
 - 继承(Block)的本质是代码替换,一般用来实现多个页面中重复不变的区域。
 - 宏(Macro)的功能类似函数,可以传入参数,需要定义、调用。
 - 包含(include)是直接将目标模板文件整个渲染出来。
 
3.6 Flask中的特殊变量和方法:
在Flask中,有一些特殊的变量和方法是可以在模板文件中直接访问的。
config 对象:
config 对象就是Flask的config对象,也就是 app.config 对象。
{{ config.SQLALCHEMY_DATABASE_URI }}request 对象:
就是 Flask 中表示当前请求的 request 对象,request对象中保存了一次HTTP请求的一切信息。
request常用的属性如下:
属性  | 说明  | 类型  | 
data  | 记录请求的数据,并转换为字符串  | *  | 
form  | 记录请求中的表单数据  | MultiDict  | 
args  | 记录请求中的查询参数  | MultiDict  | 
cookies  | 记录请求中的cookie信息  | Dict  | 
headers  | 记录请求中的报文头  | EnvironHeaders  | 
method  | 记录请求使用的HTTP方法  | GET/POST  | 
url  | 记录请求的URL地址  | string  | 
files  | 记录请求上传的文件  | *  | 
{{ request.url }}url_for 方法:
url_for() 会返回传入的路由函数对应的URL,所谓路由函数就是被 app.route() 路由装饰器装饰的函数。如果我们定义的路由函数是带有参数的,则可以将这些参数作为命名参数传入。
{{ url_for('index') }}
{{ url_for('post', post_id=1024) }}get_flashed_messages方法:
返回之前在Flask中通过 flash() 传入的信息列表。把字符串对象表示的消息加入到一个消息队列中,然后通过调用 get_flashed_messages() 方法取出。
{% for message in get_flashed_messages() %}
    {{ message }}
{% endfor %}                










