Jinja 2 模板引擎-----2

 

 

宏的定义与使用

说明:宏和python中的函数类似,可以传递参数。但是不能有返回值,可以把经常用到的代码片段放在宏中,然后把一些不固定的值抽出来作为一个变量。

 

宏的定义:

<!--定义宏--->
<% macro input(name,type='text',value=' ')%>
    <input type="{{type}}"name="{{name}}"value="{{value}}">
<% endmacro %>

宏的调用:

<!--调用宏--->
{{input('username') }}
{{input('password',type='password')}}

示列:

1.创建一个index-1。html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>    
<!---定义宏--->
{% macro input(name,type='text',value='',size=20)-%}
    <input name="{{name}}" type="{{type}}" value="{{value}}" size="{{size}}" maxlength="8">
{%- endmacro %}
<div>
    <!---调用宏--->
    <p>用户名:{{input(name='username',type='text',size=25)}}</p>
    <p>密码:{{input(name='password',type='password',value='请输入密码',size=20)}}</p>
    <p>登录:{{input(name='denglu',type='button',value='登录',size=20)}}</p>
</div>
</body>
</html>

2。创建一个xxx.py文件

from flask import Flask,render_template
import random

app=Flask(__name__)

@app.route('/')
def index():
    return render_template('index-1.html')

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

个人说明:

macro类似与python def关键字,后面跟函数名括号里面是参数。也可以不用携带参数。像上面的<input>标签的‘size’,'maxlenght',这些也可以根据实际情况加入,也可以在标签里面直接在<input>标签设置参数。

 

2.宏的导入

说明:一个宏可以在不同的模板使用,所以可以声名在一个单独的模板文件中,需要使用的时候导入即可,而导入的方法类似于python中的import。

示列:

1.单独创建一个宏文件

{% macro input(name,type='text',value='',size=20)-%}
    <input name="{{name}}" type="{{type}}" value="{{value}}" size="{{size}}" maxlength="8">
{%- endmacro %}

2.在创建一个index-1.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!---导入宏--->
{% import 'index-2.html' as form %}
<div>
    <p>用户名:{{form.input(name='username',type='text',size=25)}}</p>   <!---使用宏--->
    <p>密码:{{form.input(name='password',type='password',value='请输入密码',size=20)}}</p>
    <p>登录:{{form.input(name='denglu',type='button',value='登录',size=20)}}</p>
</div>
</body>
</html>

3.创建xxx.py文件

from flask import Flask,render_template
import random

app=Flask(__name__)

@app.route('/')
def index():
    return render_template('index-1.html')

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

说明:as后面是别名的意思的。使用的时候类似与python的对象.方法名一样的,还有一种include的用法,就是把整个模块引入到另外一个模块中。

include示列:

1.创建一个模板文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script type="text/javascript">
    document.write('这是一个模板文件')
</script>
</body>
</html>

2.在创建一个index-1.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!---include 的导入--->
{% include 'index-2.html' %}
<div>
    <p>这是网页内容</p>
</div>
</body>
</html>

3.创建一个xxx.py文件

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

注意:使用include 是在templates目录中寻找相应的文件,不要使用相对路径。

3.set和with语句的使用

说明:set和with语句都可以在Jinja 2 中定义变量并且赋值set定义的变量在整个模板范围内都有效果,with关键字在定义变量并赋值的同时,限制了with定义变量的作用范围。

语法:set

<!----定义变量赋值------>
{% set a='100000000'%}
<!---给列表或者数组赋值---->
{% set a=[('python','javascript'),('c','c++')]%}

语法:with

<!----定义变量赋值------>
{% with pass=66 %}
{{ pass }}
{% endwith %}

注意:with定义的变量的作用范围在{% with%}和{%endwith%}中才会有效,在模块的其他地方引用变量值无效。

示列:

1.创建一个index-2.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% set a='醉里挑灯看剑' %}
<p>{{ a }}</p>
{% with pass=12333 %}
<p>{{pass}}</p>
{%endwith%}
</body>
</html>

2.创建一个xxx.py文件

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

4.静态文件的加载

说明:静态文件的加载一般需要新建文件夹static,在文件夹下再创建css,js,images 文件夹,在这些文件夹中存放 css ,js,images,同时还需要使用url_for函数

示列:新建文件夹static

1.加载JS文件

<script type="text/javascript" src="{{url_for('static',filename='index-1.js')}}"></script>

2.加载css文件

<link href="{{ url_for('static',filename='about.css') }}">

5.模板的继承

说明:一个系统网站往往需要统一的结构,这样看起来比较‘整洁’,一个页面中都有标题,内容显示,底部等几个部分,如果在每一个页面中都进行这几部分的编写,那么整个网站将会有很多多余的部份,也不美观,可以采取模板继承的方式把相同的部分给提取出来作为一个基类。

1.模板继承的语法:

{% extends '模板名称'  %}

2.快的概念

模板继承包含基本模块子模块,其中基本模块包含了网站里面的基本元素基本构架,但是里面一些空或者不完整的块需要使用子模块来填充。

语法:

在父模块中

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

在子模块中

{% block block块的名称 %}
    子模板中的代码
{% endblock %}

示列:

创建一个index.html文件-----为基类

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我在地球上</title>
</head>
<body>
{% block body %}
    <div>
     <ul>
         <li>python</li>
         <li>java</li>
         <li>c++</li>
     </ul>
    </div>
{% endblock %}
</body>
</html>

2.在创建一个base.html文件-------继承上面index.html

{% extends 'index.html' %}
{% block body %}
    {{ super() }}
    <div>
    <ul>
        <li>c</li>
        <li>y</li>
    </ul>
    </div>
{% endblock %}

3.创建一个xxx.py文件

from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def hello_world():
     return render_template('base.html')
if __name__ == '__main__':
    app.run(debug=True)

注意:

1.在默认情况下,子模块如果实现了父模块定义的bolck,那么子模块中的内容就会覆盖掉父模块中的代码,如果 想要在子模块中依然保持父模块的代码,可以使用{{super()}}函数来实现。

2.如果想要在一个block中调用其他的block中的代码,可以使用{{self.块的名称}}来实现。

个人理解:Includeextends作用类似,但是在与模板的继承在余多了灵活性

 

 

 


版权声明:本文为qq_51329314原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。