模板代码复用
在模板中,可能会遇到以下情况:
- 多个模板具有完全相同的顶部和底部内容
- 多个模板中具有相同的模板代码内容,但是内容中部分值不一样
- 多个模板中具有完全相同的 html 代码块内容
像遇到这种情况,可以使用 JinJa2 模板中的 宏、继承、包含来进行实现
包含
包含(Include):它的功能是将另一个模板整个加载到当前模板中,并直接渲染
上代码:
Python部分:
@app.route('/index4')
def index4():
return render_template('04_index.html')
04_index.html 部分
<p>这是一个p标签</p>
<p>包含在使用时,如果包含的模板文件不存在时,
程序会抛出TemplateNotFound异常,
可以加上 ignore missing 关键字。
如果包含的模板文件不存在,
会忽略这条include语句</p>
# include.html 将要加载过来的html文件
{% include 'include.html' ignore missing %}
<p>这是第二个p标签</p>
</body>
include.html部分
<body>
<ul>
<li>列表1</li>
<li>列表2</li>
<li>列表3</li>
<li>列表4</li>
</ul>
</body>
模板继承
模板继承是为了重用模板中的公共内容。一般Web开发中,继承主要使用在网站的顶部菜单、底部。这些内容可以定义在父模板中,子模板直接继承,而不需要重复书写。
- 相当于在父模板中占个位置,当子模板继承父模板时,可以进行填充。
- 子模板使用 extends 指令声明这个模板继承自哪个模板
- 父模板中定义的块在子模板中被重新定义,在子模板中调用父模板的内容可以使用super()
实例:
python部分:
@app.route('/index2')
def index2():
return render_template('02_index.html')
父模板部分:base.html
<p>这是网页顶部内容</p>
# 用block 占位 用center(可以任意起名) 声明这段内容
{% block center %}
<p>这是父模板的中间内容</p>
{% endblock %}
<p>这是网页底部内容</p>
字模板部分:02_index.html
<body>
# 用extends 声明这个模板继承自哪个html文件
{% extends 'base.html' %}
# 用block重写 center 这段的内容,如果想要父类内容,用super()继承
{% block center %}
{{ super() }}
<p>这是子模板的中间部分</p>
{% endblock %}
</body>
宏
宏(macro):
- 把它看作 Jinja2 中的一个函数,它会返回一个模板或者 HTML 字符串
- 为了避免反复地编写同样的模板代码,出现代码冗余,可以把他们写成函数以进行重用
- 需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免重复
实例:
#在macro.html中定义一个form表单 input函数
{% macro input(label = "",type = "text",name = "",value = "") %}
<label>{{ label }}</label><input type="{{ type }}" name="{{ name }}" value="{{ value }}"><br/>
{% endmacro %}
#在06_index.html中引入macro.html
{% import 'macro.html' as func %}
#在06_index.html中使用模板
<form>
{{ func.input('用户名:',name='username') }}
{{func.input('身份证号:',name='idcard') }}
{{ func.input('密码:',type="password",name='password') }}
{{ func.input('确认密码:',type="password" ,name="password2") }}
{{ func.input(type="submit",value="注册") }}
</form>
#python 部分:
@app.route('/index6')
def index6():
return render_template('06_index.html')
模板中特有的变量和函数
-
config
-
request
-
session
-
g变量
-
url_for()
-
get_flashed_messages()
html 部分: <body> {{ config['DEBUG']}} <br> {{ config }} <br> {{ url_for }} <br> {{ request }} <br> {#url_root: url_root: http://127.0.0.1:5000/ #} {{ request.url_root }} <br> {#url_rule: url_rule: /index7 #} {{ request.url_rule }} <br> {#url: url: http://127.0.0.1:5000/index7 #} {{ request.url }} <br> {{ session.get('name') }} <br> {#g变量的name :#} {{ g.name }} <br> #url_for会根据传入的路由器函数名,返回该路由对应的URL #在模板中始终使用url_for()就可以安全的修改路由绑定的URL #不比担心模板中渲染出错的链接 <a href="{{ url_for('log',mobile = 123) }}">登录</a> <br> {#获取闪现消息:#} {% for message in get_flashed_messages() %} {{ message }} {% endfor %} </body> Python部分: # 需要导入模块:g,session,flash @app.route('/index7') def index7(): g.name = 'lisi' return render_template('07_index.html') app.secret_key = 'wangwu' # 要获得session 的值 首先需要设置session的值 @app.route('/set_session') def set_seesion(): session['name'] = 'zhangsan' return 'set session' @app.route('/login/<int:mobile>') def log(mobile): return 'login: %s' % mobile # 使用闪现消息的时候必须要添加秘钥 app.secret_key # 因为flash会往session里面存取 @app.route('/set_flash') def set_flash(): flash('这是闪现消息') return 'set_flash'
web表单
Web 表单是 Web 应用程序的基本功能。
它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。
在Flask中,为了处理web表单,我们可以使用 Flask-WTF 扩展,它封装了 WTForms,并且它有验证表单数据的功能
使用 Flask-WTF 需要配置参数 SECRET_KEY。
CSRF_ENABLED
是为了CSRF
(跨站请求伪造)保护。 SECRET_KEY
用来生成加密令牌,当CSRF
激活的时候,该设置会根据设置的密匙生成加密令牌。
网友评论