• 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>  
  • 相关阅读:
    Log4Net详解(2)结构篇
    vs2012中使用Spring.NET报错:Spring.Context.Support.ContextRegistry 的类型初始值设定项引发异常
    vs2010无法打开项目文件的解决方法
    Spring.NET使用assembly方式设置配置文件
    WebService生成XML文档时出错。不应是类型XXXX。使用XmlInclude或SoapInclude属性静态指定非已知的类型。
    [转贴]如何做好一个垂直搜索引擎
    怎样预防RSI呢?
    推荐一个打折的站点
    五子棋程序
    共享两本C++的好书
  • 原文地址:https://www.cnblogs.com/py-web/p/12017337.html
Copyright © 2020-2023  润新知