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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM