zoukankan      html  css  js  c++  java
  • flask --- 03 .特殊装饰器, CBV , redis ,三方组件

    一.特殊装饰器(中间件)

      1.before_request

      在请求进入视图函数之前

        @app.before_request
        def look():

      2. after_request

      在结束视图函数之后,响应返回客户端之前

        @app.after_request 
        def af1(res)
    from flask import Flask, request, session, redirect
    
    app = Flask(__name__)
    app.secret_key = "#$%^&*("
    
    @app.before_request # 在请求 之前
    def look():
        print("be1")
        if request.path == "/login":
            return None
        if session.get("username"):
            return None
        else:
            return redirect("/login")
        # print(request.method)
        # return "我是before 我不让你走"
    
    
    @app.before_request # 在请求 之前
    def be2():
        print("be2")
    
    @app.before_request # 在请求 之前
    def be3():
        print("be3")
    
    @app.route("/")
    def index():
        print("index page")
        return  "index page"
    
    @app.route("/login")
    def login():
        print("正在登陆......")
        session["username"] = "username"
        return  "login"
    
    @app.after_request
    def af1(vf_ret):
        # vf_ret.response[0]=b'2000000 OK!'
        print("af1")
        return vf_ret
    
    
    @app.after_request
    def af2(vf_ret):
        # vf_ret.response[0]=b'2000000 OK!'
        print("af2")
        return vf_ret
    
    @app.after_request
    def af3(vf_ret):
        # vf_ret.response[0]=b'2000000 OK!'
        print("af3")
        return vf_ret
    if __name__ == '__main__':
        app.run(debug=True)

    打印的结果为:

    请求顺序:
        正常 : be1 - be2 - be3 - vf - af3 - af2 - af1
        异常 :  be1 - af3 - af2 - af1

      3. errorhandler( )

      重定义错误信息

        @app.errorhandler(404)
        def error404(errormessage):

    实例:

    from flask import Flask, request, session, redirect

    app = Flask(__name__)

    @app.route("/login")
    def login():
    print("正在登陆......")
    return "login"

    @app.errorhandler(404) # 重定义404的错误
    def error404(error_message):
    print(error_message)
    return f"你确定你要查看{request.path}这个页面吗?它已经走丢了,你快去找吧 "
    # return redirect("http://baidu.com")

    if __name__ == '__main__':
    app.run(debug=True)

    二. Flask 中的 CBV

       基本格式为:

    from flask import Flask, request,views
    
    app = Flask(__name__)
    
    
    class Login(views.MethodView):
        # methods=["POST","GET"]
        # decorators = []
        def get(self):
            return "login"
    
        def post(self):
            return "post_login"
    
    app.add_url_rule("/login",view_func=Login.as_view(name="login"))
    
    
    # endpoint = None 默认视图函数名as_view(name="login") name="login"
    
    
    if __name__ == '__main__':
        app.run(debug=True)

    三.  windows 下 redis的使用

      1.下载安装

     

    ③启动服务端: redis-server

     启动客户端: redis-cli

      2.redis 模块的使用

      ①模块下载

       ②简单使用

    from redis import Redis
    
    re = Redis(host="127.0.0.1",port=6379,db=1)

                # db 的范围在 1~15 类似于15 个库
                # 切换时 用 select 1
    re.
    set("kkk","666") print(re.get("kkk"))

    四.   三方组件  之   Flask-session


    # 1.不想将Session的信息存放在Cookie # 2.将Session存放在Redis # 3.Cookie中保存Session的ID

       1.组件下载

      2.简单使用

      ①直接进行初始化

    from flask import Flask, request, session
    from flask_session import Session
    from redis import Redis
    
    # from setting import Set
    
    app = Flask(__name__)
    #初始化 app.config["SESSION_TYPE"] = "redis" app.config["SESSION_REDIS"] = Redis(host="127.0.0.1",port=6379,db=15) Session(app) @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) # app.wsgi_app

       ② 设置setting.py  初始化  进行导入

      1.在setting.py中

    from redis import Redis
    class Set(object):
        SESSION_TYPE = "redis"
        SESSION_REDIS = Redis()

      2.使用时导入

      

    五.  三方组件  之   WTForms

       ①下载

       ②简单使用

      在  .py 文件中

    from flask import Flask,request,render_template
    
    app = Flask(__name__)
    
    from wtforms.fields import simple,core
    from wtforms import Form
    from wtforms import validators
    
    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_username"
        )
    
        password = simple.PasswordField(
            label="密码",
            validators=[
                validators.DataRequired(message="数据不能为空"),
                validators.Length(min=6, max=10, message="%(min)d数据长度问题%(max)d")
            ],
            render_kw={"class": "my_class"},
            id="my_pwd"
        )
    
        repassword = simple.PasswordField(
            label="确认密码",
            validators=[
               validators.EqualTo("password",message="密码不一致")
            ]
        )
    
        email = simple.StringField(
            label="电邮",
            validators=[
               validators.Email(message="邮箱格式有问题例如1@1.1")
            ]
        )
    
        hobby = core.SelectMultipleField(    # 多选
            label="爱好",
            choices=[
                (1,"小姐姐"),
                (2,"老阿姨"),
                (3,"小萝莉"),
                (4,"御姐"),
            ],
            default=[2,4],
            coerce = int
        )
    
        gender = core.SelectField(     # 单选
            label="性别",
            choices=[
                (1, "小姐姐"),
                (2, "小哥哥"),
            ],
            default=1,
            coerce=int
        )
    
        sub = simple.SubmitField(      # 可直接写在 .html 中,更方便
            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)

       在 .html  文件中

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="" method="post" novalidate>
        {% for field in rf %}
            <p>{{ field.label }}{{ field }}{{ field.errors.0 }}</p>
        {% endfor %}
    </form>
    </body>
    </html>
  • 相关阅读:
    Coxph model Pvalue Select2
    Coxph model Pvalue Select
    WGCNA 分析
    Python 识别验证码
    Python2.X如何将Unicode中文字符串转换成 string字符串
    客户端putty xshell连接linux中vim不能正常使用小键盘的问题
    解决Selenium Webdriver执行测试时,每个测试方法都打开一个浏览器窗口的问题
    在Windows上,迁移VisualSVN server
    testNG设置测试的执行顺序
    重新加载maven项目的依赖项
  • 原文地址:https://www.cnblogs.com/sc-1067178406/p/10691238.html
Copyright © 2011-2022 走看看