首页 > Python基础教程 >
-
python基础教程之Flask模板
模板
模板导入就是将另一个模板加载到当前模板中,直接渲染。模板继承和类的继承含义是一样的,主要是为了提高代码重用,减轻开发人员的工作量。 典型应用:网站的头部、尾部信息。
模板导入
-
语法
{% include(‘模板名称’) %} {% include(‘目录/模板名称’) %}
-
使用
忽略模板文件不存在时的错误 {% include 'footer.html' ignore missing %} #也可以组成模板列表,会按照顺序依次加载 {% include ['footer.html','bottom.html','end.html'] ignore missing %}`
模板继承
如果发现在多个模板中某些内容相同,那就应该把这段内容定义到父模板中。
标签block:用于在父模板中预留区域,留给子模板填充差异性的内容,名字不能相同。 为了更好的可读性,建议给endblock标签写上名字,这个名字与对应的block名字相同。父模板中也可以使用上下文中传递过来的数据。
-
父模板
{%block 名称%} 预留区域,可以编写默认内容,也可以没有默认内容 {%endblock %}
-
子模板
标签extends:继承,写在子模板文件的第一行。 {% extends "父模板路径"%} 如果子模版没有填充,则使用父模版定义的默认值。如果有就是用子模板的实际填充内容 {%block 名称%} 实际填充内容 {%endblock %}
模板宏
在Flask的模板中有一个特性和Django内不同,这个特性就是宏。宏的功能和python中的函数类似。
-
声明一个宏
{% macro 宏的名字(参数) %} 内容 {% endmacro %}
-
调用宏
{{ 宏的名字(参数) }}
在python函数可以实现代码复用的作用,在模板中宏也有类似的作用
模板宏的使用和python中的函数的使用也类似,参数也是类似的。模板宏不常用,如果想看详细内容 点这里(是csdn的一篇博客)
模板表单 Flask-WTF
当前端使用form表单进行参数传递时候,前端一般都会用js来校验用户输入的参数是否合法。作为后端,不能依赖前端的校验。要在前端校验的基础上在进行一遍校验,防止程序出现异常。
当参数过多时,我们要对每个参数都进行校验,显得非常麻烦。在Flask中我们可以用Flask-WTF帮助我们快速校验。Flask-WTF是集成WTForms,并带有 csrf 令牌的安全表单和全局的 csrf 保护的功能。
安装
pip install flsk-wtf
- WTForms支持的HTML标准字段
字段 | 说明 |
---|---|
StringField | 文本字段 |
TextAreaField | 多行文本字段 |
PasswordField | 密码文本字段 |
HiddenField | 隐藏文本字段 |
DateField | 文本字段,值为datetime.date格式 |
DateTimeField | 文本字段,值为datetime.datetime格式 |
IntegerField | 文本字段,值为整数 |
DecimalField | 文本字段,值为decimal.Decimal |
FloatField | 文本字段,值为浮点数 |
BooleanField | 复选框,值为True和False |
RadioField | 一组单选框 |
SelectField | 下拉列表 |
SelectMultipleField | 下拉列表,可选择多个值 |
FileField | 文本上传字段 |
SubmitField | 表单提交按钮 |
FormField | 把表单作为字段嵌入另一个表单 |
FieldList | 一组指定类型的字段 |
- WTForms常用验证函数
函数 | 说明 |
---|---|
DataRequired | 确保字段中有数据 |
EqualTo | 比较两个字段的值,常用于比较两次密码输入 |
Length | 验证输入的字符串长度 |
NumberRange | 验证输入的值在数字范围内 |
URL | 验证URL |
AnyOf | 验证输入值在可选列表中 |
NoneOf | 验证输入值不在可选列表中 |
注意:
使用Flask-WTF需要配置参数SECRET_KEY。
SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密匙生成加密
具体实现:
from flask import Flask, render_template, redirect, url_for, session, request, flash
# 导入wtf扩展的表单类
from flask_wtf import FlaskForm
# 导入自定义表单需要的字段
from wtforms import SubmitField, StringField, PasswordField
# 导入wtf扩展提供的表单验证器
from wtforms.validators import DataRequired, EqualTo
app = Flask(__name__)
# 一定要记得配置SECRET_KEY!!!!!!!!!!!!!!
app.config['SECRET_KEY'] = 'python is good'
# 自定义表单类,文本字段、密码字段、提交按钮
class Login(FlaskForm):
name = StringField(label='用户:', validators=[DataRequired('用户名不能为空')])
pwd = PasswordField(label='密码', validators=[DataRequired('密码不能为空'), EqualTo('pwd1', '密码不一样')])
pwd1 = PasswordField(label='确认密码', validators=[DataRequired('密码不能为空')])
submit = SubmitField('提交')
@app.route('/login')
def login():
return render_template('login.html')
# 定义根路由视图函数,生成表单对象,获取表单数据,进行表单数据验证
@app.route('/', methods=['GET', 'POST'])
def index():
form = Login()
# 如果前端页面的输入的有错误,validate_on_submit是为flase
if form.validate_on_submit():
name = form.name.data
pwd = form.pwd.data
pwd1 = form.pwd1.data
print(name, pwd, pwd1)
return redirect(url_for('login'))
return render_template('index.html', form=form)
if __name__ == '__main__':
app.run(debug=True)
模板页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
// 这个也是很重要的
<!--设置csrf_token-->
{{ form.csrf_token() }}
{{ form.name.label }}
<p>{{ form.name }}</p>
{% for msg in form.name.errors %}
<p>{{ msg }}</p>
{% endfor %}
{{ form.pwd.label }}
<p>{{ form.pwd }}</p>
{% for msg in form.pwd.errors %}
<p>{{ msg }}</p>
{% endfor %}
{{ form.pwd1.label }}
<p>{{ form.pwd1 }}</p>
{% for msg in form.pwd1.errors %}
<p>{{ msg }}</p>
{% endfor %}
<p>{{ form.submit() }}</p>
{% for x in get_flashed_messages() %}
{{ x }}
{% endfor %}
</form>
</body>
</html>
如果有什么问题请大家在下方评论,我会改正的!—_—!