One - One Code All

Blog Content

python中jinja模板引擎

Python   2019-02-16 22:41:44

模板


通过模板,将业务逻辑和表现逻辑进行分离,使用模板来处理表现逻辑,视图函数用来处理业务逻辑,这样做的目的在于提高应用的可维护性。


模板是包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请求的上下文中才能知道。使用真实值替换变量,再返回最终得到的响应字符串,这一过程叫作渲染。


Flask使用Jinja2的模板引擎渲染模板。


Jinja2模板引擎


Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。(选择 Jinja 作为名字是因为 Jinja 是日本寺庙的名称,并且 temple 和 template 的发音类似。)


渲染模板

默认情况下,Flask在应用目录的template子目录中寻找模板。render_template()函数把Jinja2模板引擎集成到了应用中。这个函数的第一个参数是模板的文件名,随后的参数都是键值对,表示模板中变量对应的具体值。


render_template()函数在使用前,需要导入。 例如:


from flask import Flask, render_template

app = Flask(__name__)



@app.route('/')

def index():

    return 'hello'



@app.route('/user/')

def user(name):

    return 'hello,{}'.format(name)



@app.route('/temp/')

def user_t(name):

    return render_template('user.html', name=name)


在上例中,user.html文件,默认存放在templates目录中。其内容可以为:



   

   

   

    Document


   

Hello,{{ name }}!



模板中的变量

模板中的双花括弧中,放入的就是动态变量。在jinja中,变量除了上述案例中简单的形式外,还可以是Python中的列表、字典和对象。


变量的值,还可以使用过滤器修改。过滤器添加在变量名之后,二者之间以竖线分割。Jinja2中常用的过滤有:


过滤器名 作用

safe 渲染时不转义

capitalize 首字母大写

lower 小写

upper 大写

title 每个首字母大写

trim 删除收尾空白字符

striptags 删除HTML标签


控制结构

Jinja2 提供了灵活的多种控制结构,用来改变模板的渲染流程。


分支

{% if user %}

    hello,{{ user }}!

{% esle %}

    hello,Stranger!

{% endif %}

循环

        {% for comment in comments %}

           

  • {{ comment }}
  •     {% endfor %}

Jinja2中的宏类似Python中的函数。例如定义宏:


{% macro render_comment(comment) %}

   

  • {{ comment }}
  • {% endmacro %}

    使用宏:


    {{render_comment(comment)}}

    宏还可以单独存放,然后在需要使用的模板中导入:


    {% import 'macros.html' as macros %}

    {{ macros.render_comment(comment)}}

    引用

    需要在多处重复使用的模板代码,可以单独存放,然后在需要使用的地方引入:


    {% include 'common.html' %}

    除了引入外,Jinja2模板引擎还可以继承。首先,定义可重用的区块(使用block和endblock指令),比如新建一个名为base.html的基础模板:


       

        {% block head %}

        {% endblock %}

       

       

        {% block body %}

        {% endblock %}

       


    基础模板中定义的区块可以在衍生模板中覆盖:


    {% extends 'base.html' %}

    {% block body %}

    Hello,world!

    {% endblock %}

    extends指令声明该模板继承自哪个基础模板。如果需要在已有内容的块添加新内容,使用super()函数。



    上一篇:腾讯开源的词向量word2vec模型
    下一篇:Python中的作用域及global用法

    The minute you think of giving up, think of the reason why you held on so long.