• flask 第三章 特殊装饰器 CBV Flask-Session WTForms


    1.flask中的特殊装饰器

    前面我们讲过的装饰器函数中,用来登录验证,这次我们来介绍几个flask中的特殊装饰器

      1). @app.before_request

        具体的用途是: 在请求进入视图函数之前运行

    @app.before_request
    def func1():
        print('我是func1')

      2).@app.after_request

      具体的用途是 : 在执行完视图函数之后,响应客户之前运行

    @app.after_request
    def func2(ret):
        print(f'我是func2,我返回了{ret}')

      注意:这里运行after_request的时候,必须要在函数位置接收一个参数,要不然会报错

      3). @app.errorhandler(404)   #定义错误页面时,我们要写上错误页面的代码

      用途 : 当出现了404错误时,我们自定义返回一个httpresponse响应

    @app.errorhandler(404)
    def error(error_msg):
        print(error_msg)
        return f'你访问的页面不存在,发生了{error_msg}错误'

      注意: 这里我们的错误信息也要接收参数

    2.flask中的CBV

    from flask import views,Flask
    
    app=Flask(__name__)
    
    #CBV写法
    class Login(views.MethodView):
        def get(self):
            return '我是get'
      #不写405,当前请求不被允许
        def post(self):
            return '我是post'
    
    #这里我们路由的方法用下面这个,CBV不支持之前那种
    app.add_url_rule('/login',view_func=Login.as_view(name=login))

     CBV补充:

    在url中,通过as_view()方法实例化对象,然后对象通过dispatch方法,执行分发功能,dispatch()方法会根据request的method的不同调用相应的方法来处理request(如get() , post()等)

    3. flask-session 三方组件, 小插件

    flask-session  配置

    app=Flask(__name__)
    
    #以什么样的方式进行存储
    app.config['SESSION_TYPE'] = 'redis'
    
    #存储到redis中的6379,db=2的redis中
    app.config['SESSION_REDIS'] = Redis(host='127.0.0.1',port=6379,db=2)
    
    #secret_key='#$%%$^&*()' 存到redis中
    app.config["SECRET_KEY"] = "#$%%$^&*()"
    
    #就是将app放到Session中,如果没有这句话,以上的修改操作都不会被执行
    Session(app)

      在.py文件中

    @app.route("/login")
    def login():
        session["user"] = "username"
        return "OK"
    
    @app.route("/see")
    def see():
        return session.get("user","还没有session")
    
    if __name__ == '__main__':
        app.run(debug=True)

     Windows下的redis安装使用 :

      网址: https://github.com/MicrosoftArchive/redis/releases

       

       下载安装成功后,进入cmd 窗口,redis-cli 即可进入redis

           

      此时已经成功进入redis 

    切换redis  db  命令 :  select  db的id  例: select 3

    4.WTforms  三方组件 , 小插件

    from flask import Flask,request,render_template
    from wtforms.fields import simple,core
    from wtforms import Form
    from wtforms import validators 
        
    app = Flask(__name__)
    
    class Regform(Form):
        username = simple.StringField(
            label='用户名',
            validators=[
                validators.DataRequired(message='数据不能为空'),
                validators.length(min=6, max=10, message='%(min)d数据长度格式不对%(max)d')
            ],
            render_kw={'class': 'my_class'},
            id='my_user'
        )
        password = simple.PasswordField(
            label='密码',
            validators=[
                validators.DataRequired(message='数据不能为空'),
                validators.length(min=6, max=10, message='%(min)d数据长度格式不对%(max)d')
            ],
            render_kw={'class': 'my_pwd'},
            id='my_pwd'
        )
    
        repassword = simple.PasswordField(
            label='确认密码',
            validators=[
                validators.EqualTo('password', message='密码不一致')
            ],
            render_kw={'class': 'my_pwd'},
            id='my_pwd'
        )
        email = simple.StringField(
            label='电子邮箱',
            validators=[
                validators.DataRequired(message='数据不能为空'),
                validators.Email(message='邮箱格式不正确,如125@qq.com')
            ],
            render_kw={'class': 'my_email'},
            id='my_email'
        )
    
        hobby = core.SelectMultipleField(
            label='爱好',
            choices=[
                (1, '小姐姐'),
                (2, '大姐姐'),
                (3, '不大不小姐姐')
            ],
            # 默认值
            default=[2],
            # 指定发送到前端的值也是int类型
            coerce=int
        )
        gender = core.SelectField(
            label='性别',
            choices=[
                (1, '小姐姐'),
                (2, '小哥哥')
            ],
            default=[2],
            coerce=int
        )
        submit = simple.SubmitField(
            label='登录',
            render_kw={'class': 'red'}
        )
    
    
    @app.route("/reg",methods=["POST","get"])
    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)
            return f"登陆成功{rf_data.data.get('username')}"
        else:
            return render_template("reg.html",rf=rf_data)
    if __name__ == '__main__':
        app.run(debug=True)
  • 相关阅读:
    Google Chrome 默认非安全端口列表
    js判断类型的方法
    博客园样式排版自定义
    easyloader.js源代码分析
    JQuery操作cookies
    js获取iframe里面的dom
    封装GetQueryString()方法来获取URL的value值
    js 获取系统时间:年月日 星期 时分秒(动态)
    vue 滚动加载数据
    props 父组件给子组件传递参数
  • 原文地址:https://www.cnblogs.com/zty1304368100/p/10690162.html
Copyright © 2020-2023  润新知