Jinja2引擎模板(二)


宏的定义以及使用
Jinja2中的宏功能有些类似于传统语言中的函数,他跟python中的函数类似,可以传递参数,但是它不能有返回值。
宏有调用和声明俩个部分
声明一个宏

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

调用一个人宏

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

index.html




   
     宏的定义和使用


{# 宏的定义 #}
{% macro input(name,type='text',value='') -%}
   
{%- endmacro %}
{# 宏的使用 #}

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

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

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

app.py

# encoding:utf-8
from flask import Flask  # 导入flask框架模板
from flask import render_template

app = Flask(__name__)  # flask实例化
@app.route('/')  # 定义路由
def index():  # 定义试图函数
    return render_template('index.html')
if __name__ == '__main__':  # 运行
    app.run(debug=True)

注意:根据实际情况,还可以在宏的定义中加入size和placeholder等属性
宏的导入

{% import 'from html' as from %}

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

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

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

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

app.py

from flask import Flask  # 导入flask框架模板
from flask import render_template

app = Flask(__name__)  # flask实例化
@app.route('/')  # 定义路由
def index():  # 定义试图函数
    return render_template('index.html')
if __name__ == '__main__':  # 运行
    app.run(debug=True)
注意:{% import 'from.html' as from'%}这种方法导入也可以,也可以使用{% form 'from.html import input'%}实现导入
**include的使用**

在宏文件中引用其他文件宏,可以使用include语句。include语句可以把一个模板引入到另一个模板之中,类似于把一个人模板的代码复制到另一个人模板的指定位置。

{% include "header.html"%}
网页的内容 {%include "footer.html"%} #这里是把头部文件header和尾部文件footer引入到文件中

set和with语句的使用
set 与with可以在Jinja中定义变量并且赋值,set定义在整个模板中的变量内都有效。with关键字在定义并且变量赋值的同时,限制了with定义变量的作用范围。
set关键字的用法
1.给变量赋值
{% set telephone='1333333333' %}
2.给列表或者数组赋值
{% set nav=[('index.html',index),('product.html'),('product')]%}
可以在模板中使用{{telephone}}和{{nav}}来应用这些变量
with定义的变量的作用的范围{% with%}和{%endwith%}代码块内,在模板的其他的地方无效
静态文件的加载
1.加载js文件
在静态文件index.html中在之前引入jquery.js文件

#这里使用的是url函数的实现
2.加载图片文件

3.加载css文件
加载外部css文件

模板的继承
一个网站往往需要一个统一的结构,这样看起来比较整洁。
1.模板继承的语法
{% extend "模板名称"%}
模板继承包含基本模板和字模板,其中基本模板里包含网站的基本元素和基本骨架,但是有一些空的或者不完善的块需要子模块来填充。
在父模板中
{%block block的名称%}
{%endblock%}
在字模板中

{%block block的名称%}
{%endblock%}

子模板中的代码在默认的情况下,子模板如果实现父模板定义block,那么子模板block覆盖父模板中的代码。如果想要在子模板中任然保持父模板的代码那么使用{{super()}}来实现。