• Flask中的before_request装饰器和after_request装饰器以及WTForms组件


    一、before_request装饰器和after_request装饰器

      我们现在有一个Flask程序其中有3个路由和视图函数

    from flask import Flask
    
    app = Flask(__name__)  # type:Flask
    
    
    @app.route("/login")
    def login():
        return "Login"
    
    @app.route("/index")
    def index():
        return "Index"
    
    @app.route("/home")
    def home():
        return "home"
    
    app.run("0.0.0.0", 5000)

      如果我们需要让用户登录才可以看到index和home怎么办就需要认证下也就用到了session,查看session中有没有数据就可以了所以我们就要在请求index页面和home页面之前判定是否登陆了

      1.@app.before_request在请求进入视图函数之前执行

    from flask import Flask
    from flask import request
    from flask import redirect
    from flask import session
    
    app = Flask(__name__)  # type:Flask
    app.secret_key = "DragonFire"
    
    
    @app.before_request
    def is_login():
        if request.path == "/login":
            return None
    
        if not session.get("user"):
            return redirect("/login")
    
    
    @app.route("/login")
    def login():
        return "Login"
    
    
    @app.route("/index")
    def index():
        return "Index"
    
    
    @app.route("/home")
    def home():
        return "Login"

    @app.before_request就是这样一个装饰器,他所装饰的函数,都会在请求进入视图函数之前执行

      2.after_request在响应返回客户端之前执行,结束视图函数之后

      

    @app.after_request
    def foot_log(environ):
        if request.path != "/login":
            print("有客人访问了",request.path)
        return environ

    二、Flask中的另一种添加设置访问路径的方法以及Flask中的CBV

    app.add_url_rule("/路径名",view_func=类名.as_view(name="login"))

      

      1.Flask中的CBV

      比如我们设置一个登陆

    from flask import views
    class Login(views.MethodView):
        methods = ["GET","POST"]
        def get(self):
             returen "这是get请求返回"
    
        def post(self):
            print("这是post提交")
    
    app.add_url_rule("/login",view_func=Login.as_view(name="login"))

    三、WTForms三方组件小插件

      我们先要安装WTForms组件,安装方法类似于Flask

      比如我们用WTForms返回一个登陆页面带验证的那种我们应该怎么写呢??

      1.新建一个py文件用来写我们要返回的登陆页面的内容

      app01.py文件内容

    from wtforms import Form,validators
    from flask import Flask
    
    app = Flask(__name__)
    
    class Loginform(Form):
        username = simple.StringField(
            label="用户名",
            validators=[
                validators.DataRequired(message="用户名不能为空"),
                validators.length(max=10,message="用户名长度不能超过10")
            ]
        )
        password = simple.PasswordField(
            label="密码",
            validators=[
                validators.DataRequired(message="密码不能为空"),
                validators.length(min=6,message="密码长度不能小于%(min)s"),
                validators.length(max=10,message="密码长度不能大于%(max)s")
            ]
        )
    
        button = simple.SubmitField(
            label="登陆"
        )
    
    
    class Login(views.MethodView):
        methods = ["GET","POST"]
        def get(self):
            login_form = Loginform()
            return render_template("login.html",loginform = login_form)
         #把login_form类丢给前端文件
    def post(self): login_form_data = Loginform(request.form)print(request.form.get("username")) print(request.form.get("password"))return "登陆成功" if __name__ == '__main__': app.run(debug=True)

      2.我们的前端文件html

      login.html 文件中的内容

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
        <title>Bootstrap 101 Template</title>
    
        <!-- Bootstrap -->
    
    </head>
    <body>
        <form action="" method="post" novalidate>
            <p>
                {{ loginform.username.label }}
                {{ loginform.username }}
                {{ loginform.username.errors.0 }}
            </p>
            <p>
                {{ loginform.password.label }}
                {{ loginform.password }}
                {{ loginform.password.errors.0 }}
            </p>
            {{ loginform.button }}
        </form>
    </body>
    </html>
  • 相关阅读:
    我不会用 Triton 系列:Model Warmup 的使用
    我不会用 Triton 系列:Python Backend 的使用
    C++11 Memory Order
    我不会用 Triton 系列:Triton 搭建 ensemble 过程记录
    我不会用 Triton 系列:Stateful Model 学习笔记
    CUDA 概念汇总
    字符串的扩展
    梦学谷会员管理系统
    普希金-假如生活欺骗了你
    变量的解构赋值
  • 原文地址:https://www.cnblogs.com/guchenxu/p/10706670.html
Copyright © 2020-2023  润新知