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
 

  1. 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 一组指定类型的字段
  1. 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>

如果有什么问题请大家在下方评论,我会改正的!—_—!

posted @ 2019-05-26 20:09  梦亦殇  阅读(846)  评论(0编辑  收藏  举报