您的位置:首页 > 其它

Flask web开发 请求拦截和预处理

2016-03-17 17:48 441 查看
我们在开发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页面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: