@app.before_request
如果登陆了,就可以访问 index 和 home 页面,如果没登录就跳转到 login 登录
要怎么解决呢, session 对, 用 session 除了 Login 函数之外的所有函数里面全校验 session 是否登录了
太麻烦了,现在咱们只有3个函数,如果成百上千个怎么整啊
装饰器,对没错,装饰器是一个很好的方案,但是啊,我现在还是成败上千个函数,我要在每一个函数定义的时候加上@装饰器,还是很麻烦
怎么办。。。。
@app.before_request 在请求(request)进入视图函数之前执行
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 极为相似或者说是一模一样,只不过它只会被执行一次
@app.after_request
@app.after_request 在响应(response)返回客户端之前执行 , 结束视图函数之后
@app.after_request def foot_log(environ): if request.path != "/login": print("有客人访问了",request.path) return environ
1.before_request 请求进入进入视图函数之前进行处理 return None 继续执行 否则阻断
2.after_request 视图函数结束 响应客户端之前
正常周期: be1 - be2 - be3 - vf - af3 - af2 - af1
异常周期: be1 - af3 - af2 - af1 (假设be1 异常)
.errorhandler
3.errorhandler 重定义错误信息
3.1.有参数的装饰器errorhandler(监听错误状态码 5xx 4xx Int)
3.2.所装饰的函数必须有一个形参来接受 errorMessage
from flask import Flask, render_template, send_file app = Flask(__name__) @app.before_request def be1(): print('be1') return None @app.before_request def be2(): print('be2') return None # return "error" @app.before_request def be3(): print('be3') return None # return "error" @app.after_request def af1(res): print('af1') return res @app.after_request def af2(res): print('af2') return res @app.after_request def af3(res): print('af3') return res @app.route("/info", methods=["GET", "POST"]) def info(): return render_template("info.html") @app.errorhandler(404) def error404(error_message): print(error_message) return send_file('1.png') #404可以不单单返回信息 可以返回图片 音乐等等 if __name__ == '__main__': app.run()