溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中Flask請求擴展與中間件的示例分析

發(fā)布時間:2021-06-11 09:54:58 來源:億速云 閱讀:175 作者:小新 欄目:開發(fā)技術

小編給大家分享一下Python中Flask請求擴展與中間件的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

一、請求擴展

1.before_request

作用: 類比django中間件中的process_request,在請求到來執(zhí)行路由函數(shù)之前先執(zhí)行. 但是如果有多個順序是從上往下執(zhí)行.

應用: 基于它做用戶登錄認證

注意: 如果before_request的返回值不是None的清空下, 返回的而是別的值, 那么后續(xù)的請求都不會執(zhí)行,本次請求直接返回, 如果定義了after_request那么會接著它執(zhí)行, 最終本次請求響應結(jié)束.

@app.before_request
def process_request(*args,**kwargs):
    if request.path == '/login':
        return None
    user = session.get('user_info')
    if user:
        return None
    return redirect('/login')

2.after_request

作用: 類比django中間件中的process_response,如果請求沒有出現(xiàn)異常的情況下, 會在請求返回return之前執(zhí)行. 但是如果有多個順序是從下往上執(zhí)行.

@app.after_request  # 后執(zhí)行
def process_response1(response):
    print('process_response1 走了')
    return response

@app.after_request  # 先執(zhí)行
def process_response2(response):
    print('process_response2 走了')
    return response

3.before_first_request

作用: 項目啟動起來接收到第一次請求時執(zhí)行.

應用: 項目初始化用來保證以后項目只要不重啟就不再繼續(xù)執(zhí)行.

@app.before_first_request
def first():
    print('我的第一次')

4. teardown_request

作用: 在每一個路由函數(shù)執(zhí)行完畢之后執(zhí)行,即使遇到了異常也會執(zhí)行. (提示: 返回reutrn沒有任何的效果, 不能控制返回的結(jié)果)

應用: 記錄日志

@app.teardown_request  
def ter(e):  # e就是上一個路由函授執(zhí)行過程中出現(xiàn)被捕獲的異常信息.
    print(e)
    print('我是teardown_request ')

5.errorhandler

作用: 綁定錯誤的狀態(tài)碼進而可以捕獲服務器的錯誤, 并返回對應的錯誤頁面.

@app.errorhandler(500)
def error_500(arg):
    return render_template('error.html', message='500錯誤')


@app.errorhandler(404)
def error_404(arg):
    return render_template('error.html', message='404錯誤')

6.template_global

作用: 全局的標簽, 在任意的html頁面中就可以直接使用, 不需要在render_template中傳遞參數(shù)以后才能使用.

@app.template_global()
def sb(a1, a2):
    return a1 + a2

# html頁面中直接使用, 不需要傳遞參數(shù).
{{ sb(1,2) }}

7.template_filter

@app.template_filter()
def db(a1, a2, a3):
    return a1 + a2 + a3

# html頁面中直接使用, 不需要傳遞參數(shù). 其中1傳遞給a1, 2傳遞給a2, 3傳遞給a3. (提示: Django中的過濾器最多只可以傳遞二個參數(shù))
{{ 1|db(2,3) }}

總結(jié):

1.重點掌握before_requestafter_request

2.注意有多個的情況,執(zhí)行順序

3.before_request請求攔截后(也就是有return值),response所有都執(zhí)行

二、中間件

class Md(object):
    def __init__(self, old_wsgi_app):
        self.old_wsgi_app = old_wsgi_app

    def __call__(self, environ, start_response):
        print('開始之前')
        ret = self.old_wsgi_app(environ, start_response)
        print('結(jié)束之后')
        return ret


if __name__ == '__main__':
    # 1. 我們發(fā)現(xiàn)當執(zhí)行app.run方法的時候,最終執(zhí)行run_simple,最后執(zhí)行app(),也就是在執(zhí)行app.__call__方法
    # 2. 在__call__里面,執(zhí)行的是self.wsgi_app().那我們希望在執(zhí)行他本身的wsgi之前做點事情。
    # 3. 所以我們先用Md類中__init__,保存之前的wsgi,然后我們用將app.wsgi轉(zhuǎn)化成Md的對象。
    # 4. 那執(zhí)行新的的app.wsgi_app,就是執(zhí)行Md的__call__方法。
    # 5. 最后把原來的wsgi_app替換為自定義的

    app.wsgi_app = Md(app.wsgi_app)
    app.run()

看完了這篇文章,相信你對“Python中Flask請求擴展與中間件的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI