• Flask的WTforms


    一、简单介绍

    WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。

    类似于Django中的modelform

    安装:

    pip3 install wtforms

    二、简单使用

     后端代码app.py

    from flask import Flask, request, render_template, session
    from flask_session import Session
    from redis import Redis
    from wtforms import Form, validators, widgets
    from wtforms.fields import simple, core
    
    app = Flask(__name__)
    app.config["DEBUG"] = True
    # 用原生的session要设置SECRET_KEY
    # app.config["SECRET_KEY"] = 'uihuiwuiwoiw'
    
    # 使用redis session
    app.config["SESSION_TYPE"] = "redis"
    # 实例化redis
    app.config["SESSION_REDIS"] = Redis(host="127.0.0.1", port=6379) # redis 不要放在公网
    
    # 设置存在客户端的cookies中的session的名字
    # app.config["SESSION_COOKIE_NAME"] = "#¥%……&*(#E$RTY$%RTY%^Y&U%^&*"
    
    # 用第三方session替换原生的session;这是基于原生的session的
    Session(app)
    
    
    class LoginForm(Form):
        username = simple.StringField(
            label="用户名",
            validators=[
                validators.DataRequired(message="用户名不能为空"),
                validators.Length(min=4, max=8, message="用户名必须大于等于4,小于等于8")
            ]
        )
        password = simple.PasswordField(
            label="密码",
            validators=[
                validators.DataRequired(message="密码不能为空"),
                validators.Length(min=4, max=8, message="密码必须大于等于4,小于等于8")
            ])
    
    
    @app.route('/login',methods=['GET','POST'])
    def login():
        login_form = LoginForm()
        if request.method == "GET":
            return render_template('login.html', lf=login_form)
        else:
            login_form_data = LoginForm(request.form)
            if login_form_data.validate():
                session['user'] = login_form_data.data.get('username')
                return str(session["user"])
            else:
                return render_template("login.html", lf=login_form_data)
    
    
    class RegForm(Form):
        username = simple.StringField(
            label="用户名",
            validators=[
                validators.DataRequired(message="用户名不能为空"),
            ]
        )
        password = simple.PasswordField(
            label="密码",
            validators=[
                validators.DataRequired(message="密码不能为空"),
                validators.Length(min=6, max=16, message="密码必须大于等于6,小于等于16")
            ])
        repassword = simple.PasswordField(
            label="确认密码",
            validators=[
                validators.EqualTo("password", message="两次密码不一致")
            ]
        )
        gender = core.SelectField(
            label="性别",
            choices=(
                (1, ""),
                (2, "")
            ),
            default=1,
            # widget=widgets.RadioInput(),
            # render_kw={"class": "my_class"},
            coerce=int
        )
        email = simple.StringField(
            label="邮箱",
            validators=[
                validators.DataRequired(message="邮箱不能为空"),
                validators.Email(message="不符合规定")
            ]
        )
        hobby = core.SelectMultipleField(
            label="癖好",
            choices=(
                (1, "萝莉"),
                (2, "御姐"),
                (3, "小哥哥"),
                (4, "正太")
            ),
            # widget=widgets.,
            coerce=int,
            default=(1, 4)
        )
    
    
    @app.route('/reg', methods=['GET', 'POST'])
    def reg():
        if request.method == "GET":
            rf = RegForm()
            return render_template("reg.html", rf=rf)
        else:
            rf_data = RegForm(request.form)
            if rf_data.validate():
                print(rf_data.data.get("hobby"))
                print(type(rf_data.data.get("gender")))
                return "注册成功"
            else:
                return render_template("reg.html", rf=rf_data)
    
    
    if __name__ == '__main__':
        app.run()

    登录模板:login.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="" method="post" enctype="multipart/form-data" novalidate>
        <p>{{ lf.username.label }}:{{ lf.username }}{{ lf.username.errors.0 }}</p>
        <p>{{ lf.password.label }}:{{ lf.password }}{{ lf.password.errors[0] }}</p>
        <input type="submit" value="登录">
    </form>
    </body>
    </html>

    模板中也可以直接循环获取模板数据如下的注册页面

    注册模板:reg.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style></style>
    </head>
    
    <body>
    <form action="" method="post" novalidate>
        {% for field in rf %}
            <p>{{ field.label }}{{ field }} <span style="color: red">{{ field.errors.0 }}</span></p>
        {% endfor %}
        <input type="submit" value="注册">
    
    </form>
    </body>
    </html>

  • 相关阅读:
    JQuery 点击子控件事件,不会触发父控件的事件
    JQuery对Style和css设置
    2019vue学习视频(入门到精通)
    新建一个vue项目
    FIS3 构建
    node环境变量
    阿里云重启ssh
    msf 获取session 之后
    acccheck (暴力破解使用SMB协议的Windows密码)
    利用 Cut 指定输出内容
  • 原文地址:https://www.cnblogs.com/zwq-/p/10452243.html
Copyright © 2020-2023  润新知