Flask之请求扩展
一、before_request
before_request相当于django中的process_request,每一个请求在被处理前都会经过这个方法,那么这个利用这个方法可以做什么呢?
- 用户登录认证(这样避免了每一个视图函数都加用户登录认证的装饰器)
- 用户权限校验
from flask import Flask, redirect, request, session, render_template app = Flask(__name__) app.secret_key = 'abcdef' @app.before_request def process_request(*args, **kwargs): # 排除白名单,登录/login在进来时不需要进行验证 if request.path == '/login': return None else: username = session.get('username') print('username', username) if username: return None else: return redirect('/login') @app.route('/login') # 请求http://127.0.0.1:5000/login?username=zhangsan def login(): # 该函数在before_request白名单中,需要单独判断 username = request.args['username'] print(username) if username == 'zhangsan': session['username'] = username return redirect('/index') else: return render_template('login.html') @app.route('/index') def index(): return render_template('index.html') if __name__ == '__main__': app.run()
每一个请求进来之后首先就是经过before_request方法进行处理,但是/login是我们的登录地址,将其作为白名单处理,其余的每一个请求都会经过before_request函数进行处理(session判断)。
before_request函数中如果返回值为None,那么就会继续向下走;如果不为None就会返回你的return值。另外还有一个before_first_request方法,顾名思义就是只对第一个请求做处理。
二、after_request
after_request相当于django中的process_response,每一个请求的返回值在被返回给页面前都会经过这个方法。
from flask import Flask from flask.wrappers import Response app = Flask(__name__) @app.after_request def process_response(response): return Response('hello') #将所有的请求响应内容都进行了更改 @app.route('/index') def index(): return "index" if __name__ == '__main__': app.run()
所有的请求响应都会经过after_request方法,你可以在响应到页面前对所有视图函数的结果再进行一次处理。注意的是,该函数不能返回None值,如果不做任何处理,只需要返回response即可。
三、errorhandler
该装饰器函数就是对返回到页面错误信息的定制。
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return "index" @app.errorhandler(404) def error_404(arg): #当访问的页面出现404错误,就会返回该函数的返回值 return '页面找不到了...' if __name__ == '__main__': app.run()
errorhandler装饰器函数传入错误的code_or_exception,返回自定制的错误提示信息。
四、template_global、template_filter
template_global与template_filter分别是模板标签和模板过滤器。
from flask import Flask,render_template #实例化Flask对象 app = Flask(__name__) @app.template_global() def double(n): return 2*n @app.template_filter() def add(x1,x2,x3): return x1+x2+x3 @app.route('/') def index(): return render_template('index.html') #模板中可以直接使用标签和过滤器 if __name__ == '__main__': app.run()
模板index.html内容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {{ double(2) }}<!--模板标签--> {{ 1|add(2,3) }}<!--过滤器--> </body> </html>
作者:iveBoy
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。