第十篇 特殊装饰器
@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中访问不存在路由查看结果