1

Flask-session和WTForms

   

Flask-session

安装 pip install flask-session 

  1. # -*- coding: utf-8 -*-  
  2. from flask import Flask, session  
  3. from flask_session import Session  
  4. from redis import Redis  
  5.       
  6. # flask session  
  7. app = Flask(__name__)  
  8. app.secret_key = 'rfrevtrtr55g'  
  9. #  
  10. # @app.route('/')  
  11. # def index():  
  12. #     session['user'] = 'peach'  
  13. #     return 'index'  
  14. #  
  15. # app.run(host='0.0.0.0'debug=True)  
  16.       
  17. 第三方组件flask-session  
  18. app = Flask(__name__)  
  19. app.config['SESSION_TYPE'] = 'redis'  # 保存sessionredis  
  20. app.config['SESSION_REDIS'] = Redis(host='192.168.32.71',  
  21.                                     password='redhat',  
  22.                                     db=1)   # session redis配置  
  23. Session(app)  # 替换flask 中的session, 重写了flask session get_interface方法  
  24.       
  25. # config.setdefault('SESSION_TYPE', 'null') # config是字典设置默认值,有的话就不管  
  26.       
  27. @app.route('/')  
  28. def index():  
  29.     session['user'] = 'peach'  # 这里发现浏览器里面的session变成了uuid, redis存放了session信息  
  30.                                 #  uuid 是从redis中取数据的  
  31.     return 'index'  
  32.       
  33. app.run(host='0.0.0.0'debug=True

保存的结果 session:uuid

  1. 127.0.0.1:6379[1]> KEYS *  
  2. 1) "session:554532f2-f92f-4bbf-94c8-639ceb043dce"  
  3. 2) "session:d6f03654-f0a0-4046-933c-503f515499a6" 

   

扩展

Flask-session 如何巧妙替换flask再带的session 

   

WTForms

安装 pip install WTForms  

视图

  1. # -*- coding: utf-8 -*-  
  2. from flask import Flask, render_template,request  
  3. from wtforms.fields import simple, core  
  4. from wtforms import validators  
  5. from wtforms import Form  
  6.     
  7. app = Flask(__name__, template_folder='../templates')  
  8.     
  9.     
  10. class LoginForm(Form):  
  11.     username = simple.StringField(  
  12.         label="用户名",  # 标签标记  
  13.         validators=[validators.DataRequired(message="用户名不能为空"),  
  14.                     validators.Length(min=3,max=8,message="不是长了就是短了")],  # 校验条件 可迭代条件  
  15.         # description='11111111111',  # 描述标记  
  16.         id="user_id",  # 标签ID  
  17.         default=None,  # 默认值  
  18.         widget=None,  # 默认组件(input type="text"StringField中已经被实例化了  
  19.         render_kw={"class":"my_login"},  # {"class":"my_login"}  
  20.     )  
  21.     password = simple.PasswordField(  
  22.         label="密码",  # 标签标记  
  23.         validators=[validators.DataRequired(message="密码不能为空"),  
  24.                     validators.Length(min=3max=16message="不是长了就是短了"),  
  25.                     validators.Email(message="密码必须符合邮箱规则")],  # 不知道  
  26.         # description='11111111111',  # 描述标记  
  27.         id="user_id",  # 标签ID  
  28.         default=None,  # 默认值  
  29.         widget=None,  # 默认组件(input type="text"StringField中已经被实例化了  
  30.         render_kw={"class": "my_login"},  # {"class":"my_login"}  
  31.     )  
  32.     
  33. @app.route("/",methods=["GET","POST"])  
  34. def index():  
  35.     if request.method == "GET":  
  36.         fm = LoginForm()  
  37.         return render_template("wtf.html",wtf = fm)  
  38.     else:  
  39.         new_fm = LoginForm(request.form)  
  40.         if new_fm.validate():  
  41.             return new_fm.data.get("username")  
  42.         else:  
  43.             return render_template("wtf.html", wtf=new_fm)  
  44.     
  45. if __name__ == '__main__':  
  46.     app.run(host='0.0.0.0' ,debug=True)

前端

  1. <!DOCTYPE html>  
  2. <html lang="zh-CN">  
  3. <head>  
  4.   <meta charset="UTF-8">  
  5.   <title>Title</title>  
  6.   <meta name="viewport" content="width=device-width, initial-scale=1">  
  7. </head>  
  8. <body>  
  9. <form action="" method="post" novalidate>  
  10.   {{ wtf.username.label }}  
  11.   {{ wtf.username }}  
  12.   <p><h1>{{wtf.username.errors.0}}</h1></p>  
  13.   <p>  
  14.       {{ wtf.password.label }}  
  15.       {{ wtf.password }}  
  16.   </p>  
  17.   <p><h1>{{wtf.password.errors.0}}</h1></p>  
  18.   <input type="submit" value="登录">  
  19. </form>  
  20. </body>  
  21. </html>  

注册表单演示

  1. # -*- coding: utf-8 -*-  
  2. from flask import Flask, render_template,request  
  3. from wtforms.fields import simple, core  
  4. from wtforms import validators  
  5. from wtforms import Form  
  6.     
  7. app = Flask(__name__, template_folder='../templates')  
  8.     
  9. class RegForm(Form):  
  10.     username = simple.StringField(  
  11.         label="用户名",  # 标签标记  
  12.         validators=[validators.DataRequired(message="用户名不能为空"),  
  13.                     validators.Length(min=3max=8message="不是长了就是短了")],)  # 校验条件 可迭代条件  
  14.     
  15.     
  16.     password = simple.PasswordField(  
  17.         label="密码",  # 标签标记  
  18.         validators=[validators.DataRequired(message="密码不能为空"),  
  19.                     validators.Length(min=3max=16message="不是长了就是短了"),  
  20.                     validators.Email(message="密码必须符合邮箱规则")],)  # 校验字段  
  21.     
  22.     regpassword = simple.PasswordField(  
  23.         label="确定密码",  # 标签标记  
  24.         validators=[validators.EqualTo(fieldname="password"message='密码两次不相同')], )  # 确认密码  
  25.     
  26.     gender = core.RadioField(  
  27.         label="性别",  
  28.         coerce=str,  # 数据类型  
  29.         choices=(  
  30.             ("1", ""),  
  31.             ("2", "")  
  32.         ),  
  33.         default="1"  # 下面对应上面数据类型int就写1 str 就写"1"  
  34.     )  
  35.     
  36.     hobby = core.SelectMultipleField(  
  37.         label="爱好",  
  38.         validators=[validators.Length(min=2max=4message="癖好有问题")],  
  39.         coerce=int,  
  40.         choices=(  
  41.             (1, "fengjie"),  
  42.             (2, "luoyufeng"),  
  43.             (3, "lixueqin"),  
  44.             (4, "wuyifan"),  
  45.             (5, "panta")  
  46.         ),  
  47.         default=(1, 3, 5)  
  48.     )  
  49.     
  50. @app.route('/res', methods=['POST', 'GET'])  
  51. def res():  
  52.     if request.method == "GET":  
  53.         rf = RegForm()  
  54.         return render_template("res.html",rfrf = rf)  
  55.     else:  
  56.         new_rf = RegForm(request.form)  
  57.         if new_rf.validate():  
  58.             return new_rf.data.get("username")  
  59.         else:  
  60.             return render_template("res.html", rf=new_rf)  
  61.     
  62.     
  63. if __name__ == '__main__':  
  64.     app.run(host='0.0.0.0' ,debug=True)  

前端

  1. <!DOCTYPE html>  
  2. <html lang="en">  
  3. <head>  
  4.     <meta charset="UTF-8">  
  5.     <title>res</title>  
  6. </head>  
  7. <body>  
  8.     
  9. <form action="" method="post" novalidate>  
  10.     {% for foo in rf %} {# 遍历出来的是单个对象 #}  
  11.         <p>{{ foo.label }}{{ foo }}{{ foo.errors.0 }}</p>  
  12.     {% endfor %}  
  13.     <input type="submit" value="注册">  
  14. </form>  
  15. </body>  
  16. </html>  
posted @ 2019-12-10 16:11  小白森  阅读(324)  评论(0编辑  收藏  举报