本質上,就是是cookie 下的session存儲在redis中,方便快速取得sessionhtml
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
本質上就是經過進行類的繼承關係快速生成一張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)
前端redis
<!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>