zoukankan      html  css  js  c++  java
  • 第十篇 特殊装饰器

    @app.template_global()  
    @app.template_filter()  
    上边两个估计了解了

    Flask我们已经学习很多基础知识了,现在有一个问题

    我们现在有一个 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 "Login"
    
    app.run("0.0.0.0", 5000)
    
    简单的小程序
    简单小程序

    如果登陆了,就可以访问 index 和 home 页面,如果没登录就跳转到 login 登录

    要怎么解决呢, session 对, 用 session 除了 Login 函数之外的所有函数里面全校验 session 是否登录了

    太麻烦了,现在咱们只有3个函数,如果成百上千个怎么整啊

    装饰器,对没错,装饰器是一个很好的方案,但是啊,我现在还是成败上千个函数,我要在每一个函数定义的时候加上@装饰器,还是很麻烦

    那么就引出了我们要学习的第一个知识点:

    1.@app.before_request 在请求(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.run("0.0.0.0", 5000)
    
    解决所有问题
    解决所有问题

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

    request.path 是来读取当前的url地址如果是 /login 就允许直接通过 return None 你可以理解成通过放行

    校验session中是否有user 如果没有的话,证明没有登录,所以毫不留情的 redirect("/login") 跳转登录页面

    还有一个要提的 @app.before_first_request 它与 @app.before_request 极为相似或者说是一模一样,只不过它只会被执行一次

    2. @app.after_request 在响应(response)之前做出响应

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

    很少应用,但是要了解有这么个东西

    3. @app.errorhandler() 报错返回友好界面

    @app.errorhandler(404)
    def error404(args):
        print(args)
        return "您访问的页面不存在或者走丢了,,,,,,%s" % (args)

    总结:测试观察下边代码和问题可得最终结果

    from flask import Flask, request, session, render_template, redirect
    import setting
    from serv import users
    
    app = Flask(__name__, template_folder="temp", static_url_path="/static")
    app.config.from_object(setting.Debug)
    
    app.register_blueprint(users.users_blue)
    
    
    @app.before_request
    def is_login():
        print("be1")
        if request.path == "/login": 
            return None  #
        if session.get("user"):
            return None
        else:
            return redirect("/login")
    
    
    @app.before_request
    def be2():
        print("be2")
        return None
    
    
    @app.before_request
    def be3():
        print("be3")
        return None
    
    
    @app.after_request
    def af3(res):
        print("af3")
        return res
    
    
    @app.after_request
    def af2(res):
        print("af2")
        return res
    
    
    @app.after_request
    def af1(res):
        print("af1")
        return res
    
    
    @app.route("/", endpoint="index", methods=["POST", "GET"])
    def index():
        return render_template("index.html")
    
    
    @app.route("/detail", endpoint="detail")
    def detail():
        return render_template("detail.html")
    
    
    @app.route("/login", methods=["GET", "POST"], strict_slashes=False)
    def login():
        if request.method == "GET":
            return render_template("login.html")
        else:
            session["user"] = request.form.get("username")
            return redirect("/")
    
    
    @app.errorhandler(404)
    def error404(args):
        print(args)
        return "您访问的页面不存在或者走丢了,,,,,,%s" % (args)
    
    
    if __name__ == '__main__':
        app.run(debug=True)
    测试

    访问url查看打印结果

    1.登录后查看答应结果

    2.清除cookie查看打印结果

    3.url中访问不存在路由查看结果

  • 相关阅读:
    VS2010 安装MVC3
    MVC3教程之新手入门(转)
    MVC工作原理
    MVC开发人员必备的五大工具
    MVC3简介
    C#中各种字符类型的转化
    c#中设置Excel单元格格式
    浪子
    累了,再见
    利用HttpHandler处理自定义控件中需要引用大量js文件问题
  • 原文地址:https://www.cnblogs.com/clbao/p/10134245.html
Copyright © 2011-2022 走看看