宏的定义与使用
说明:宏和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.块的名称}}来实现。
个人理解:Include和extends作用类似,但是在与模板的继承在余多了灵活性。