栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

第三章 jinja2模板引擎

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第三章 jinja2模板引擎

目录

第三章 jinja2模板引擎

3.1模板引擎概述及简单实用

3.2向模板中传递参数

3.3模板中控制语句之if语句

3.3模板中控制语句之for语句

3.5 Flask的过滤器

3.6宏的定义及使用

3.7 set和with语句的使用

3.8 静态文件加载(引用多种文件)

3.9模板的继承

3.10 练习


第三章 jinja2模板引擎

在Flask中常用jinja2模板引擎实现复杂的页面渲染,jinja2是灵活,快速和安全的模板引擎技术。

本章主要涉及的知识点有:

如何使用Flask渲染模板;

在模板中引用一个或多个参数

if语句在模板中的使用

for语句在模板中的使用

3.1模板引擎概述及简单实用

思考:随着不同终端的兴起,开发人员如何写一份功能代码在所有设备上都能使用

高度重视前后端的分离,后段负责业务逻辑/数据访问,前端负责展现/交互逻辑

from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
    return render_template('index.html')
@app.route('/user/')
def user(username):
    return render_template('user.html')
if __name__ == '__main__':
    app.run()

我的理解就是把网页(html文件)挂在了服务器上

Flask通过render_template()函数来实现模板的渲染,使用jinja2模板引擎,需要from flask import render_template命令导入render_template函数。在视图函数中使用return方法,render_template()函数的首个函数声明使用哪个模板文件。

3.2向模板中传递参数

单个变量

在app.py文件上把username=name

@app.route('/user/')
def user(username):
    return render_template('user.html', name=username)

在html文件中带入参数,用{{}}

    欢迎您:{{name}} 

多个变量

在app.py文件中

def index():
    title ='python的键值对'
    author = 'jack'
    return render_template('index.html',**locals())
    或return render_template('index.html',var1=title,var2=title2)
    

在在html文件中



传过来的标题:{{title}}  或传过来的标题:{{var1}}

传过来的作者:{{author}} 或传过来的作者:{{var2}}

总结:在render_template()函数中,如果给模板传递全部本地变量,可以使用**locals()方法,

此时,在模板中可以使用{{title}} 和 {{author}}来直接表述变量。

3.3模板中控制语句之if语句

在app.py文件中

import random#导入random模块
app = Flask(__name__)#Flask初始化
@app.route('/') #定义路由
def hello_world():#定义视图函数
       rand1=random.randint(0,1)# 产生0-1范围内的整型数
       return render_template('index.html',name=rand1)#渲染模板,并向模板传递值

在html文件中

   
   
   {% if name %}
      产生的随机数有效!             
   {% else %}
      产生的随机数无效!             
   {% endif %}
   

在此例子中random随机函数0无效,1有效,所以刷新页面有不同的效果。

由此,可以制作一个抽奖的随机系统(html文件)

建议:多使用if——elif——elif——else——endif 结构

   
   
   {% if name==0 %}
       重在参与
   {% elif name==1 %}
       恭喜,您抽得了一等奖
   {% elif name==2 %}
       恭喜,抽得了二等奖!
   {% else %}
       恭喜,抽得了三等奖!
   {% endif %}
   {{ name }}               
   

总结:模板表达式都是在分隔符 {{}} 内的;

控制语句都是在 {% %} 内的;(注意紧密想连)

模板注释放在 {# #} 内。

3.3模板中控制语句之for语句

app.py文件

def hello_world():#定义视图函数
       goods = [{'name': '怪味少女开衫外套春秋韩版学生bf原宿宽松运动风2018新款秋装上衣',  'price': 138.00},
                {'name': 'A7seven 复古百搭牛仔外套女秋季2018新款宽松显瘦休闲夹克衫上衣',  'price': 100.00},
                {'name': '黑色时尚西装外套女春秋中长款2018新款韩版休闲薄款chic西服上衣', 'price': 100.00},
                {'name': 'HAVE RICE饭馆 颜值超耐打 复古牛仔外套女短款 2018春秋新款上衣', 'price': 129.00}
               ]#定义列表goods
       return render_template('shop.html', **locals())#渲染模板,并向模板传递参数

html文件(建表操作)

注意:正确写法{% for goods in goods %},不能{ %% },{和%必须紧密相连。


    
        
        
    
    
{% for goods in goods %}

{% endfor %}
商品名称商品价格
{{goods.name}} {{goods.price}}

在hello_world视图函数中定义一列表goods,期属性主要是name和price,用for语句将其遍历出来。 

总结:在模板中,使用if和for语句更好渲染模板,通过{%逻辑表达语句%}可以实现代码的嵌套,

与Python基本一致,但必须要在{%%}内部。

3.5 Flask的过滤器

过滤器本质就是一个转换函数,有时候我们不仅需要输出变量的值,还需要把某个变量的值修改在显现出来,

而在模板中不能直接调用Python中的某些方法,这莫就利用到了过滤器。

3.5.1常见过滤器(没运行出来)

列如:P42

app.py文件

#encoding:utf-8
from flask import Flask,render_template#导入Flask以及render_template模块
app = Flask(__name__)#Flask初始化
@app.route('/')#定义路由
def hello_world():#定义视图函数
     student={
         'name':'wangjie',
         'age':-18
     }
     return render_template('index.html',**student)#渲染模板,并向模板传递值
if __name__ == '__main__':
     app.run()

html文件

 
 
 
     
    过滤器
 
 
 

{{ age|abs }}

{{'hello'|capitalize}}

{{'hello'|replace('h','x')}}

{{[01,80,42,44,77]|first}}

{{[01,80,42,44,77]|last}}

{{[01,80,42,44,77]|count}}

{{[01,80,42,44,77]|sort}}

{{[01,80,42,44,77]|join(',')}}

{{18.8888|round(2,'floor')}}

{{18.8888|round}}

{{-2|abs}}

3.5.2自定义过滤器(含不理解部分)

通过add_template_filter方法实现自定义过滤器,

第一个参数是函数名,第二个函数名自定义的过滤器名称。

app.py ——实现每三行输出一条分割线

#encoding:utf-8
import sys#导入sys模块
from flask import Flask,render_template#导入Flask和render_template模块
app = Flask(__name__)#Flask初始化
@app.route('/')#定义路由
 #视图函数
def hello_world():
     goods = [{'name': '怪味少女开衫外套春秋韩版学生bf原宿宽松运动风2018新款秋装上衣'},
              {'name': 'A7seven 复古百搭牛仔外套女秋季2018新款宽松显瘦休闲夹克衫上衣'},
              {'name': '黑色时尚西装外套女春秋中长款2018新款韩版休闲薄款chic西服上衣'},
              {'name': 'HAVE RICE饭馆 颜值超耐打 复古牛仔外套女短款 2018春秋新款上衣'},
              {'name': ' 颜值超耐打 复古牛仔外套女短款 2018春秋新款上衣'},
              {'name': 'HAVE RICE饭馆  复古牛仔外套女短款 2018春秋新款上衣'},
              {'name': 'HAVE RICE饭馆 颜值超耐打  2018春秋新款上衣'},
              {'name': 'HAVE RICE饭馆 颜值超耐打 复古牛仔外套女短款 '},
              {'name': 'HAVE RICE饭馆 颜值超耐打 复古牛仔外套女短款 2018春秋新款上衣end'},
              ]#定义列表goods
     return render_template('index.html',**locals())#渲染模板,并向模板传递值
def do_index_class(index):#定义函数
     if index % 3==0:#每间隔3行输出line
         return 'line'
     else:
         return ''
    
        
app.add_template_filter(do_index_class,'index_class')#使用自定义过滤器添加css
​
if __name__ == '__main__':
    app.run()

html文件

 
 
 
     
     Title
     
         .line{
             display: inline-block;
             height:1px;
             width:100%;
             background:#00CCFF;
             overflow:hidden;
            vertical-align: middle;
         }
     
 
 
     
     {% for goods in goods %}
     
     
         
  • {{ goods.name }}                                 {% endfor %}
  • 3.6宏的定义及使用

    3.6.1宏的定义

    jinja2中的宏功能有些类似于传统编程语言中的函数,它跟Python中函数类似,可以传递参数,

    但不能有返回值,可以将一些经常用的代码放入宏中,然后把一些不固定的值取出来作为一个变量。

    定义宏

    {% macro input(name,type='text',value='')-%)
    
    {{%-endmacro%}}

    定义宏要加macro,定义宏结束要加endmacro标志。宏的名称就是input,

    他有三个参数,分别是name,type和value,后两个参数有默认值。

    我们可以使用表达式来调用这个宏:

    {{input('username')}}
    {{input('password',type='password')}}

    登录系统:html文件如下,app.py文件就是把html文件运用jinja模板render_template()

    {#宏的定义 #}
    {% macro input(name, type='text', value= '',size='40',placeholder="请在这里输入") -%}
        
    {%- endmacro %}
    {#宏的使用#}
    
    

    用户名 :{{ input('username')}}

    密 码 :{{ input('password',type='password')}}

    登 录 :{{ input('submit',type='submit',value='登录')}}

    3.6.2宏的导入

    建立一个专门放宏的文件from.html

    {% macro input(name, type='text', value= '' ,size=20, placeholder="请在这里输入用户名") -%}
        
    {%- endmacro %}

    html文件,app.py文件不再赘述

    {% from 'form.html' import input %}        
     
      

    用户名 :{{ input('username')}}

     

    密 码 :{{ input('password',type='password')}}

     

    登 录 :{{ input('submit',type='submit',value='登录')}}

     

    3.6.3 include的使用

    宏文件中引用其他宏,可以使用include语句。include语句可以把一个模板引入到另一个模板中。

    index.html-------主html文件

    
            .header{
                    width: 100%;
                    height:40px;
                    margin:20px 20px;
            }
            .footer{
                   width: 100%;
                    height: 40px;
                    margin:20px 20px;
            }
            .content{
                    width: 100%;
                    height: 40px;
                    margin:20px 20px;
            }
            
    
    
    {% include "header.html" %}
    
    这是网页内容
        
    {% include "footer.html" %}
        

    header.html

    
    
    
        
        Title
    
    
    这是网页头部
    
    
    

    3.7 set和with语句的使用

    set与with语句都可以在jinja2中定义使用并赋予值。set定义的变量在整个模板范围内都有效。

    with关键字在定义变量和与赋值同时,限制了with定义变量的作用范围。

      set用法

    给变量赋值

    {% set telephone ='1388888888' %}

    给列表与数组赋值

     {% set nav = [('index.html', 'index'), ('product.html', 'product')] %}

    在模板中使用{{telephone}}和{{nav}}来引用这些定义变量。

      with用法

       {% with pass = 60 %}
        {{ pass }}
        {% endwith %}

    with定义变量的作用范围在{% with %}和{% endwith %}代码内,在模板的其他地方,引用此变量无效。

    3.8 静态文件加载(引用多种文件)

    静态文件的加载一般需要先新建文件夹static,在文件夹下在建立css、js和images文件夹,

    在这里存放css、js、images,同时需要使用"url_for"函数

    在template目录下新建一个名为index.html文件,在app.py的视图函数中使用

    return render_template('index.html')方法来渲染模板。

    
        
        Title
        
        
    {##}
    
        
        
    
        
    
    
        
        
    {#测试jquery是否加载#}
    
        
    
        
        
    { url_for('static', filename='images/car.jpg') }}">
    ​
        
    

    3.9模板的继承

    在templates目录中创建index.html、base.html和product.html 3个静态文件。

    base.html文件作为基类,index.html和product.html文件作为子类,子类去继承基类的基本内容。

    base.html

    
    
    
    {% block title %}{% endblock %} -我的网站
    
    
    {% block body %}
        这是基类中的内容
    {% endblock %}
    
    

    index.html

    {% extends "base.html" %}
    {% block title %}网站首页{% endblock %}
    {% block body %}
    ​
    
        {{ super() }}
    ​
    这是网站首页的内容!
    {% endblock %}

    product.html

    {% extends "base.html" %}
    {% block title %}产品列表页{% endblock %}
    {% block body %}
    这是产品列表页的内容!
    ​
    { self.其他block的名称() }}-->
     取得网页标题的内容:   {{ self.title() }}
    ​
    {% endblock %}

    3.10 练习

    1.使用for语句,新建一个工程,打印出九九乘法表。

    app.py

    from flask import Flask
    app = Flask(__name__)
    @app.route('/')
    def hello_world():
        for i in range(1, 10):
            for j in range(1, i + 1):
                print(str(j) + str("*") + str(i) + "=" + str(i * j), end="t")
            print()
        return 'Hello World!'
    if __name__ == '__main__':
        app.run()

    2.在视图函数中定义一个字典books,请在模板中遍历出字典的所有属性。

    app.py

    from flask import Flask,render_template
    app = Flask(__name__)
    @app.route('/')
    def hello_world():
        books = [
         {
         'name': '红楼梦',
         'author': '曹雪芹',
        'price': 200
        },
         {
          'name': '水浒传',
          'author': '施耐庵',
          'price': 100
        }
        ]
        return render_template('index.html',**locals())
    ​
    ​
    if __name__ == '__main__':
        app.run()

    index.html

       
      
       
           
           Title
       
       
       
           
           
           
           
           
           
           
           {% for books in books %}
               
                   
                   
                   
                     {% endfor %}
           
       
    书名作者价格
    {{ books.name}}{{ books.author}}{{ books.price}}
        ​

    转载请注明:文章转载自 www.mshxw.com
    本文地址:https://www.mshxw.com/it/725726.html
    我们一直用心在做
    关于我们 文章归档 网站地图 联系我们

    版权所有 (c)2021-2022 MSHXW.COM

    ICP备案号:晋ICP备2021003244-6号