Flask web开发 请求拦截和预处理
我们在开发WEB应用时,往往会需要对所有的url请求进行拦截,做些预处理,比如权限处理、日志等统一处理。
本文介绍一下Flask中的处理机制。我们通过一个简单的例子来说明。
1、编写一个简单应用 run.py,内容如下
from flask import Flask from flask import render_template,request,redirect app = Flask(__name__) @app.before_request def myredirect(): if not request.path=='/': username = request.args.get('username') if not username: return redirect('/') else: print 'success' @app.route('/') def hello_world(): return 'Hello World!' @app.route('/name') def hello_name(): return 'this is name\n' @app.route('/show') def show(): return 'this is show \n' if __name__ == '__main__': app.debug = True app.run('0.0.0.0',80)
上面代码中的关键是
@app.before_request
这个标识,flask会将所有的请求交给上面的myredirect()方法处理。
在这个方法中,判断请求路径是否是 / ,如果是不做任何处理,直接转到 / 对应的方法处理。
如果不是 / ,则检查url是否带username查询参数, 如果带了,则只是打印下信息,还是交给该url具体的路径处理;否则跳转到 / 请求。
2、完善前面的案例
有了前面这个基础,我们可以完善下前面文章《Flask web开发 处理Session》中的遗留问题。
我们修改 前面文章案例中的 run.py文件,修改后的内容如下:
from flask import Flask from flask import render_template, redirect,url_for from flask import request,session app = Flask(__name__) @app.before_request def before_action(): print request.path if request.path.find('.ico')==-1: if not request.path=='/login': if not 'username' in session: session['newurl']=request.path return redirect(url_for('login')) @app.route('/login', methods=['POST','GET']) def login(): error = None if request.method == 'POST': if request.form['username']=='admin': session['username'] = request.form['username'] if 'newurl' in session: newurl = session['newurl'] session.pop('newurl', None) return redirect(newurl) else: return redirect('/home') else: error = 'Invalid username/password' return render_template('login.html', error=error) @app.route('/home') def home(): return render_template('home.html',username=session['username']) @app.route('/test') def test(): return render_template('test.html') app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT' if __name__ == '__main__': app.debug = True app.run('0.0.0.0',80)
上面代码增加了一个拦截方法。
该方法先判断请求是否是普通请求(图片等不做处理,这里是示例,直接写死了只对ico文件不处理,实际有问题)。
如果是普通请求,判断是否是login 请求。
如果不是login 请求,再判断session中是否已经有 username(也就是是否已经登录),如果没有则跳转到login页面。