Flask 的中間件

Flask 的 請求擴展 與 中間件

flask 可以通過 擴展(裝飾器)來實現類似於django 中間件的功能

類似於django 的中間件, 在執行視圖函數之前, 之後的執行某些功能

1 @app.before_first_request

執行一次,第一次請求結束,在第一批函數執行後 就不再執行(狀態改爲False)

@app.before_first_request
def before_first_request1():
    print(‘before_first_request1‘)



2 @app.before_request: 類似於Django的process_request

在視圖函數執行前,按照順序依次執行(列表順序)

@app.before_request
def before_request1():
    Request.nnn = 123
    print(‘before_request1‘)


@app.before_request
def before_request2():
    print(‘before_request2‘)



3 @app.after_request:類似於Django的 process_response

在視圖函數執行後,按照反序依次執行(列表逆序)

@app.after_request
def after_request1(response):
    print(‘before_request1‘, response)
    return response


@app.after_request
def after_request2(response):
    print(‘before_request2‘, response)
    return response

注意:請求被 before_request 攔截後,所有的 response會執行

另外:擴展可以只對 單獨的藍圖對象生效,也可以對全局的 app 都生效

4 @app.errorhandler(404) 定製錯誤信息

@app.errorhandler(404)
def page_not_found(error):
    return render_template(‘404.html‘),404



5 定製模板方法 @app.template_global()裝飾器 @app.template_filter()裝飾器

 @app.template_global()裝飾器   
       def func(a,b,c)  --->>  全局temlate使用 {{func(a,b,c)}}

  和 @app.template_filter()裝飾器
      def func(a,b,c)  --->>  全局temlate使用 {{a|filter(b,c)}}  # 需要管道符



6 根據flask的請求入口,實現類似中間件的操作

class  Middleware(object):
    def __int__(self,old_wsgi_app):
        self.old_wsgi_app = old_wsgi_app

    def __call__(self, environ, start_response):
        print(‘before‘)
        ret = self.old_wsgi_app(environ, start_response)
        print(‘after‘)
        return ret
    
if __name__ == ‘__main__‘:
    app.wsgi_app = Middleware(app.wsgi_app)
    app.run()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章