• flask flask_session,WTForms


    一.Flask_session

    本质上,就是是cookie 下的session存储在redis中,方便快速取得session

    from flask import Flask,session
    from flask_session import Session
    from redis import Redis
    
    app=Flask(__name__)
    #这两个是必须填写的,在session源码中,
    '''
      if config['SESSION_TYPE'] == 'redis':
                session_interface = RedisSessionInterface(
                    config['SESSION_REDIS'], config['SESSION_KEY_PREFIX'],
                    config['SESSION_USE_SIGNER'], config['SESSION_PERMANENT'])
    '''
    
    app.config['SESSION_TYPE'] = "redis"
    app.config["SESSION_REDIS"]=Redis(host='127.0.0.1',port=6379,db=6)
    
    Session(app)
    @app.route("/")
    def index():
        session["user"]="value"
        return "hello"
    if __name__ == '__main__':
        app.run(debug=True)
    
    
    #查看进入redis redis-cli
    #选择db select db的序号
    #存储在redis get session:c0cdc66b-3ef0-4d0c-8030-a37f14be7e5d

    二.WTForms

    本质上就是通过进行类的继承关系快速生成一张form表单,在前端通过后端发送的实例化对象点出他的属性

    from flask import Flask, render_template,request
    from wtforms import simple, core
    from wtforms import validators
    from wtforms import Form
    
    app=Flask(__name__)
    '''
    源码 进行覆盖
    def __init__(self, label=None, validators=None, filters=tuple(),
                 description='', id=None, default=None, widget=None,
                 render_kw=None, _form=None, _name=None, _prefix='',
                 _translations=None, _meta=None):
    '''
    
    
    class LoginForm(Form):
        username=simple.StringField(    #生成的input标签的name:username
            label="用户名",               #字段
            validators=[
                validators.DataRequired(message="用户不能为空"),
                validators.Length(min=3,max=12,message="不是长了就是断了")
    
            ],             #校验条件
            id="user_id",  #input标签的id
            default=None,  #默认值,当发生select时的默认选择
            widget=None,   # 默认组件(input type="text") 在StringField中已经被实例化了
            render_kw={"class":"my_login"}    #input标签下的类class=my_login
    
        )
        # 这里PasswordField是继承StringField的 区别在于PasswordField是密文的
        password=simple.PasswordField(
    
            label="密码",
            validators=[
                validators.DataRequired(message="用户不能为空"),
                validators.Length(min=3, max=12, message="不是长了就是断了"),
                validators.Email(message="密码必须符合邮箱规则")
    
            ],
            id="user_pwd",
            default=None,
            widget=None,
            render_kw={"class": "my_login"}
    
    
        )
    
    
    
    class RegForm(Form):
        username=simple.StringField(
            label="用户名",
            validators=[
                validators.DataRequired(message="用户名不能为空"),
                validators.Length(min=3, max=8, message="用户名不是长了就是短了")
            ])
        password=simple.PasswordField(
                label="密码",
                validators=[
                    validators.DataRequired(message="密码不能为空"),
                    validators.Length(min=3, max=16, message="密码不是长了就是短了"),
                    validators.Email(message="密码必须符合邮箱规则")
                ])
    
        repassword=simple.PasswordField(
                label="确认密码",
                validators=[validators.EqualTo(fieldname="password",message="未确认眼神")])
    
    
    
        gender=core.RadioField(  #单选 core下的RadioField
                label="性别",
                coerce=str,
                choices=(("1",""),
                         ("2","")
                         ),
                default="1"  
    
            )
        hobby=core.SelectMultipleField(    #多选 core下的SelectMultipleField
            label="爱好",
            validators=[validators.Length(min=2,max=4,message="癖好有问题")],
            coerce=int,
            choices=((1,"food"),(2,"eat"),(3,"swim"),(4,"joke"),(5,"love")
        ),
            default=(1,2,3)
            )
    
    
    @app.route("/",methods=["GET","POST"])
    def index():
        if request.method=="GET":
            fm = LoginForm()
            return  render_template("index.html",wtf=fm)
        else:
            new_fm=LoginForm(request.form)
            if new_fm.validate():
                return  new_fm.data.get("username")
            else:
                return render_template("index.html",wtf=new_fm)
    @app.route("/reg",methods=["GET","POST"])
    def reg():
        if request.method=="GET":
            rf = RegForm()
            return render_template("reg.html",rf=rf)
        else:
            rf = RegForm(request.form)
            if rf.validate():
                return rf.data.get("password")
            else:
                return render_template("reg.html",rf=rf)
            
    if __name__ == '__main__':
        app.run(debug=True)

    前端

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="" method="post" novalidate>
        {{ wtf.username.label }}
        {{ wtf.username }}
        <p>
        <h2>{{ wtf.username.errors.0 }}</h2></p>
        <p>
            {{ wtf.password.label }}
            {{ wtf.password }}
    
        </p>
        <p>
        <h1>
            {{ wtf.password.errors.0 }}
        </h1>
        </p>
        <input type="submit" value="登录">
    
    
    </form>
    </body>
    </html>

  • 相关阅读:
    ACMICPC 2009 China Northeast Area Contest :(
    2576 数论
    sql source control and sql prompt
    C语言中的单精度双精度数的有效位数
    [软件调试学习笔记]防止栈缓冲区溢出的基于Cookie的安全检查机制
    A tiny introduction to asynchronous IO
    Mysql扩展之replication概述
    C语言中的单精度双精度数的有效位数
    MySQL Cluster(MySQL 集群) 初试
    MySQL Cluster(MySQL 集群) 初试
  • 原文地址:https://www.cnblogs.com/zhangqing979797/p/10274319.html
Copyright © 2020-2023  润新知