zoukankan      html  css  js  c++  java
  • Flask从入门到精通之Jinja2模板引擎

    我们使用一个简单的例子切入到Jinja2模板引擎,形式最简单的Jinja2模板引擎就是一个包含响应文本的文件,实例如下:

     <h1>Hello World!</h1>

    最简单的包含变量的模板引擎实例如下:

     <h1>Hello, {{ name }}!</h1>

    渲染模板

    默认情况下,Flask 在程序文件夹中的templates 子文件夹中寻找模板。在下一个hello.py版本中,要把前面定义的模板保存在templates 文件夹中,并分别命名为index.html 和user.html。程序中的视图函数需要修改一下,以便渲染这些模板:

    from flask import Flask,render_template
    from flask.ext.script import Manager
    app = Flask(__name__)
    manager = Manager(app)
    
    @app.route('/')
    def index():
        return render_template('index.html')
    
    @app.route('/user/<name>')
    def user(name):
        return render_template('user.html',name=name)
    
    if __name__ == '__main__':
        manager.run()

    Flask 提供的render_template 函数把Jinja2 模板引擎集成到了程序中。render_template 函数的第一个参数是模板的文件名。随后的参数都是键值对,表示模板中变量对应的真实值。在这段代码中,第二个模板收到一个名为name 的变量。左边的“name”表示参数名,就是模板中使用的占位符;右边的“name”是当前作用域中的变量,表示同名参数的值。

    变量

    上例中,在模板中使用的{{ name }} 结构表示一个变量,它是一种特殊的占位符,告诉模板引擎这个位置的值从渲染模板时使用的数据中获取。Jinja2 能识别所有类型的变量,甚至是一些复杂的类型,例如列表、字典和对象。在模板中使用变量的一些示例如下:

     <p>A value from a dictionary: {{ mydict['key'] }}.</p>
     <p>A value from a list: {{ mylist[3] }}.</p>
     <p>A value from a list, with a variable index: {{ mylist[myintvar] }}.</p>
     <p>A value from an object's method: {{ myobj.somemethod() }}.</p>

    可以使用过滤器修改变量,过滤器名添加在变量名之后,中间使用竖线分隔。例如,下述模板以首字母大写形式显示变量name 的值:

    Hello, {{ name|capitalize }}

    Jinja2 常用的过滤器如下:

    • safe:渲染值的时候不转意
    • capitalize:把渲染值的首字母大写,其他字符小写
    • lower:把值转换为小写
    • upper:把值转化为大写
    • title:把每个单词的首字母大写
    • trim:去掉首尾空格
    • striptags:渲染之前把值中所有的HTML 标签都删掉

    safe 过滤器值得特别说明一下。默认情况下,出于安全考虑,Jinja2 会转义所有变量。例如,如果一个变量的值为' < h1>Hello</h1>',Jinja2 会将其渲染成'&lt;h1&gt;Hello&lt;/h1&gt;',浏览器能显示这个h1 元素,但不会进行解释。很多情况下需要显示变量中存储的HTML 代码,这时就可使用safe 过滤器。

    控制结构

    Jinja2 提供了多种控制结构,可用来改变模板的渲染流程,我们在此只介绍其中最常用的控制结构

    下面这个例子展示了如何在模板中使用条件控制语句:

    {% if user %}
    Hello, {{ user }}!
    {% else %}
    Hello, Stranger!
    {% endif %}

    另一种常见需求是在模板中渲染一组元素。下例展示了如何使用for 循环实现这一需求:

    <ul>
        {% for comment in comments %}
        < li>{{ comment }}</ l i>
        {% endfor %}
    </ul>

    Jinja2 还支持宏。宏类似于Python 代码中的函数。例如:

    {% macro render_comment(comment) %}
    <li>{{ comment }}</li>
    {% endmacro %}
    <ul>
        {% for comment in comments %}
        {{ render_comment(comment) }}
        {% endfor %}
    </ul>

    为了重复使用宏,我们可以将其保存在单独的文件中,然后在需要使用的模板中导入

    {% import 'macros.html' as macros %}
    <ul>
        {% for comment in comments %}
        {{ macros.render_comment(comment) }}
        {% endfor %}
    </ul>

    需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免重复:

    {% include 'common.html' %}

    另一种重复使用代码的强大方式是模板继承,它类似于Python 代码中的类继承。首先,创建一个名为base.html 的基模板:

    <html>
    <head>
        {% block head %}
        <title>{% block title %}{% endblock %} - My Application</title>
        {% endblock %}
    </head>
    <body>
        {% block body %}
        {% endblock %}
    </body>
    </html>

    block 标签定义的元素可在衍生模板中修改。在本例中,我们定义了名为head、title 和body 的块。注意,title 包含在head 中。下面这个示例是基模板的衍生模板:

    {% extends "base.html" %}
    {% block title %}Index{% endblock %}
    {% block head %}
        {{ super() }}
        <style>
        </style>
    {% endblock %}
    {% block body %}
    <h1>Hello, World!</h1>
    {% endblock %}

    extends 指令声明这个模板衍生自base.html。在extends 指令之后,基模板中的3 个块被重新定义,模板引擎会将其插入适当的位置。注意新定义的head 块,在基模板中其内容不是空的,所以使用super() 获取原来的内容

  • 相关阅读:
    Leetcode 1489找到最小生成树李关键边和伪关键边
    Leetcode 113 路径总和 II
    hdu 1223 还是畅通工程
    hdu 1087 Super Jumping! Jumping! Jumping!
    hdu 1008 Elevator
    hdu 1037 Keep on Truckin'
    湖工oj 1241 畅通工程
    湖工oj 1162 大武汉局域网
    hdu 2057 A + B Again
    poj 2236 Wireless Network
  • 原文地址:https://www.cnblogs.com/senlinyang/p/8351422.html
Copyright © 2011-2022 走看看