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页面。

posted @ 2016-03-17 17:48  51kata  阅读(7351)  评论(0编辑  收藏  举报