python-jinja2模板引擎

文章目录

  • 1. 什么是Jinja2模板引擎?
  • 2. 语法
    • 1). Jinja2变量显示语法: {{ 变量名 }}、过滤器
      • -如何自定义过滤器?
    • 2). for循环:
    • 3). if语句
    • 4). 宏的操作====相当于函数
    • 5). include包含操作
    • 6). 模板的继承: 一般网站的导航栏和底部不会变化, 为了避免重复编写导航栏信息;
      • - 如何定义模板?
      • - 如何继承基模板?

1. 什么是Jinja2模板引擎?

1). python的Web开发中, 业务逻辑(实质就是视图函数的内容)和页面逻辑(html
文件)分开的, 使得代码的可读性增强, 代码容易理解和维护;

2). 模板渲染: 在html文件中,通过动态赋值 ,
将重新翻译好的html文件(模板引擎生效) 返回给用户的过程。

3). 其他的模板引擎: Mako, Template, Jinja2

2. 语法

1). Jinja2变量显示语法: {{ 变量名 }}、过滤器

完整的过滤器查看位置: http://jinja.pocoo.org/docs/templates/#builtin-filters
Jinja2变量内置过滤器:
safe 渲染值时不转义
capitalize 把值的首字母转换成大写,其他字母转换成小写
lower 把值转换成小写形式
upper 把值转换成大写形式
title 把值中每个单词的首字母都转换成大写
trim 把值的首尾空格去掉
striptags 渲染之前把值中所有的 HTML 标签都删掉

实现变量过滤器:

from flask import  Flask, render_template
app = Flask(__name__)

class User(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return  "" %(self.name)

@app.route('/')
def index():
    message = " this is a Message "
    li = ['fentiao', 'fensi', 'fendai']
    info = {
        'name': 'fentiao',
        'age':10
    }
    fentiao = User(name="粉条", age=5)
    tags = "

hello world

" # 可以传入各种类型的变量 return render_template('06_index.html', message=message, names = li, info=info, fentiao=fentiao, tags = tags ) if __name__ == '__main__': app.run()

编写06_use_block.html:




    
    Title




{{ message | lower }}

{{ message | upper }}

{{ message | title }}

{{ message | capitalize }}

{{ name }}

{{ info }}

{{ fentiao }}

{{ tags | striptags }}

{{ tags | safe }}

python-jinja2模板引擎_第1张图片

-如何自定义过滤器?

# 定义一个函数
def format_data(s):
    return  "这是一个过滤器:" + s
# 将该函数添加到默认过滤器中;
app.add_template_filter(format_data, 'fmt')

if __name__ == '__main__':
    app.run()

06_index.html:




    
    Title



{{ message | fmt }}

{{ message | lower }}

{{ message | upper }}

{{ message | title }}

{{ message | capitalize }}

{{ name }}

{{ info }}

{{ fentiao }}

{{ tags | striptags }}

{{ tags | safe }}

python-jinja2模板引擎_第2张图片

2). for循环:

{% for i in li%}

{% endfor %}

举例:

@app.route('/users/')
def users():
    usersinfo = [('user%s' %(i), "password%s" %(i)) for i in range(100)]
    return  render_template('06_users.html',
                            usersinfo = usersinfo
                            )
if __name__ == '__main__':
    app.run()

06_users.html




    
    Title






    {% for item in userinfo %}
    
        {% if item.1 =='passwords2' %}
        
        {% else %}
        
        {% endif %}
    
    {% endfor %}

名称 密码
{{ item.0 }}{{ item.1 }}{{ item.1 }}

python-jinja2模板引擎_第3张图片

3). if语句

{% if user == 'westos'%}


{% elif user == 'hello' %}

{% else %}

{% endif%}

4). 宏的操作====相当于函数

  • 如何定义宏?

{%  macro render(id) %}
    

hello world {{ id }}

{% endmacro %}
  • 如何调用宏?

{{ render(1) }}
{{ render(2) }}
{{ render(3) }}
@app.route("/macro/")
def macro():
    return  render_template('06_macro.html')

06_macro.html




    
    Title




{%  macro render(id) %}
    

hello world {{ id }}

{% endmacro %} {{ render(1) }} {{ render(2) }} {{ render(3) }} {{ render(4) }} {{ render(5) }} {{ render(6) }}

python-jinja2模板引擎_第4张图片

5). include包含操作

如何使用: {% include “06_inclued.html”%}
新建一个06_inclued.html
python-jinja2模板引擎_第5张图片




    
    Title




{%  macro render(id) %}
    

hello world {{ id }}

{% endmacro %} {{ render(1) }} {{ render(2) }} {{ render(3) }} {{ render(4) }} {{ render(5) }} {{ render(6) }} {% include "06_inclued.html"%}

python-jinja2模板引擎_第6张图片

6). 模板的继承: 一般网站的导航栏和底部不会变化, 为了避免重复编写导航栏信息;

- 如何定义模板?

bootstrap中文网里面有许多模板和样式

设计一个导航栏:
新建一个06_base.html作为基模板




    
    {% block title %}  {% endblock %}


这是导航栏
{% block body %} hello {% endblock %}
这是底部

- 如何继承基模板?

新建一个06_use_block.html实现继承06_base.html:自定义模块title、body,其余继承base

{% extends  '06_base.html'%}

{% block title %}
    继承案例
{% endblock %}


{% block body %}
这是最新填的block内容

{% endblock %}

python-jinja2模板引擎_第7张图片

你可能感兴趣的:(python,flask)