1. 程式人生 > >Flask 請求中介軟體、錯誤處理、標籤、過濾器、CBV

Flask 請求中介軟體、錯誤處理、標籤、過濾器、CBV

[TOC] # 一、請求中介軟體 **中介軟體:** ```python 1 before_first_request 當專案啟動後,接收到的第一個請求,就會執行before_first_request裝飾的函式,執行順序也是誰先註冊就誰先執行 2 before_request 請求沒有經過響應函式的時候,會執行before_request裝飾的函式,誰先註冊誰先執行。只要有一個函式有返回值,後面的所有before_request都不會執行,且響應函式也不會執行。其有沒有返回值都不會影響after_request的執行 3 after_request是再before_request與響應函式執行後執行。他必須接收響應引數,並且要把響應返回。執行順序是誰先註冊後執行。 ``` **使用** ```python from flask import Flask, request app = Flask(__name__) # 執行順序:1-2-3-5-4 # 1.整個專案的第一次 @app.before_first_request def first(): print('我的第一次') # 2.響應函式之前執行,先註冊先執行 @app.before_request def beforel(): print('我是before1') # 3.響應函式之前執行,先註冊先執行 @app.before_request def before2(): print('我是before2') # 5.響應函式之後執行,先註冊後執行 @app.after_request def after1(response): print('響應後的引數2', response) print('after1') return response # 4.響應函式之後執行,先註冊後執行 @app.after_request def after2(response): print('響應後的引數1', response) print('after2') return response @app.route('/') def index(): return "ok" if __name__ == '__main__': app.run() ``` # 二、請求中介軟體額外方法(重寫原始碼) ```python ##瞭解的知識點 from flask import Flask app = Flask(__name__) class MyMiddleware: def __init__(self,old_wsgi_app): self.old_wsgi_app =old_wsgi_app def __call__(self, environ, start_response): #這befor的befor print("響應函式開始之前乾的事情") ret = self.old_wsgi_app(environ, start_response) #這是after的after print("結束函式結束之後乾的事情") return ret @app.route("/") def index(): return "ok" if __name__ == '__main__': app.wsgi_app = MyMiddleware(app.wsgi_app) app.run() ``` # 三、請求錯誤處理 ``` 1 teardown_request,一旦遇到錯誤就會執行,並且把錯誤傳遞給teardown_request裝飾的函式, 沒有錯誤也會執行,但是是錯誤為None,他並不能處理錯誤,只能記錄 2 errorhandle 可以捕獲錯誤,並且對錯誤做出響應,返回給使用者,如果你要用errorhandler你必須指定他捕獲哪種型別的錯誤,就必須傳錯誤碼,然後就返回值,返回給使用者 ``` ```python # 遇到錯誤就執行 @app.teardown_request def tear(e): print(e) print('我是teardown') # 捕獲錯誤,傳錯誤碼 @app.errorhandler(500) def error_500(e): print(e) return '程式已崩500' # 捕獲錯誤,傳錯誤碼 @app.errorhandler(404) def error_500(e): print(e) return '程式已崩404' @app.route('/') def index(): return render_template('index1.html') if __name__ == '__main__': app.run() ``` # 四、請求標籤、過濾器 ```python # 相當於一個函式,可以在頁面中使用它,要加括號 # 相當於django中的標籤 @app.template_global() def get_sum(a,b): return a+b # django中的過濾器 @app.template_filter() def get_something(a,b,c,d): return a+b+c+d @app.route('/') def index(): return render_template('index1.html') if __name__ == '__main__': app.run() ``` index1.html 使用 ```html

index1頁面

{{get_sum(1,1)}} {{1|get_something(1,1,1)}} ``` # 五、CBV寫法 ## 基礎版 ```python from flask import Flask,views,url_for app = Flask(__name__) def tt(func): def inner(*args,**kwargs): print("你追到我。。") rv = func(*args,**kwargs) print("嘿嘿嘿。。。") return rv return inner class Index(views.View): methods = ["GET"] #規定哪些請求方式可以請求我這個路由 decorators =[tt,] #這個是給 我們的響應新增裝飾器 def dispatch_request(self): return "ojbk" app.add_url_rule("/index",view_func=Index.as_view(name="index"),endpoint="index1") # 1 為什麼要給as_view傳遞name= "index", # 2 他作用Index.as_view(name="index")他返回是的view這個函式物件,我們傳遞name="index"是給view的__name__改變名字。如果不傳,我沒有辦法通過名字來找路由的對映關係,因為都是”view“ ``` ## 常用版 ```python from flask import Flask,views,url_for app = Flask(__name__) def tt(func): def inner(*args,**kwargs): print("響應函式開始之前乾的事情") rv = func(*args,**kwargs) print("結束函式結束之後乾的事情") return rv return inner class Login(views.MethodView): methods = ["GET","POST"] # 規定哪些請求方式可以請求我這個路由 decorators = [tt, ] # 這個是給 我們的響應新增裝飾器 def get(self): print(url_for("index1")) return "get" def post(self): return "post" app.add_url_rule("/login",view_func=Login.as_view(name="login")) #實現方法是重寫了dispatch_request,通過請求方法,來找到當前類中的函式。 if __name__ == '__main__': app.ru