我們在開發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頁面。