sanic官方文檔解析之Exception和Middleware,Listeners

1,異常服務器

 異常是從處理請求內部拋出來的,而且經過Sanic自動的被處理異常,,異經常使用第一個參數攜帶異常信息,還能夠接受在HTTP響應中要傳遞迴的狀態代碼。引起異常app

  • 1.1引起異常

自動觸發異常,,簡單的額使用raise從sanic.exceptions的模塊中拋出相關的異常便可異步

 

你也可使用停止函數的狀態碼,來拋異常 ,如上圖所示:xss

  • 1.2異常處理

 @app.exception被使用來重寫處理默認的異常,,這個裝飾器指望一系列的異常做爲參數去處理,你能夠經過SanicException去抓住異常,裝飾異常處理函數必須攜帶請求和異常對象在參數中.async

你也能夠增長異常處理.函數

有些狀況下,,你也許想添加一些更詳細的錯誤信息處理函數,能夠默認提供,在那種狀況下,你能夠對Sanic的錯誤語法進行子類的劃分.  oop

  • 1.3有用的例外

一些有用的例外,目前如上所示:spa

  • NotFound:當找不到適合請求的路由時調用
  • ServerError:當服務器發生故障時調用。若是用戶代碼中出現異常,一般會發生這種狀況
  • 有關引起異常 的完整列表,請參考sanic.exception模塊.

2, 中間件:debug

中間件是用在請求到來以前和響應請求以後,,中間件能夠被用來修改 氫氣去和 響應,在中間件處理函數中3d

另外,Sanic提供監聽運行的代碼的多種要點在你懂得的應用中 

Sanic中有2中類型的中間件,請求和響應,者兩種響應都用@app.middleware裝飾器來裝飾.用裝飾器的參數是字符串來代替request或者是response.

from sanic import Sanic
from sanic.response import text # 實例化Sanic對象 app = Sanic(__name__) @app.middleware("request") async def print_on_request(request): print("i print when a request is received by the server") @app.middleware("response") async def print_on_response(request ,response): print("i print when a response is returned by the server")
  • 2.1修改請求和響應

中間件可以修改給定的請求和響應的參數,只要中間件沒有返回請求或者響應

from sanic import Sanic

# 實例化Sanic對象
app = Sanic(__name__) @app.middleware("request") async def add_key(request): # 增長請求對象的關鍵字,就像地點的對象 request["foo"] = "bar" @app.middleware("response") async def custom_banner(request, response): response.headers["Server"] = "Fake-Server" @app.middleware("response") async def prevent_xss(request, response): response.headers["x-xss-protection"] = "1; mode-block" app.run(host="0.0.0.0", port=8000, debug=True)

以上代碼應用在中間件中,第一個中間件增長一個新的關鍵字foo到請求request中,中間件的運行是由於請求對象的主體相似字典對象,第二個中間件定製的橫幅將會改變HTTP響應頭爲Fake-Server,最後一箇中間件是爲了增長HTTP頭防止xss攻擊,這些2個功能在函數返回一個 response響應的時候調用 

  • 2.2早期的迴應

若是中間件返回一個httpresponse對象,那麼請求將中止處理並返回響應。若是在到達相關的用戶路由處理程序以前請求出現這種狀況,則永遠不會調用該處理程序。返回響應還將阻止任何其餘中間件的運行

from sanic import Sanic
from sanic.response import text # 實例化一個Sanic對象 app = Sanic(__name__) @app.middleware("request") async def halt_request(request): return text("i halted the request") @app.middleware("response") async def halt_response(request, response): return text("i halted the response")

 3,監聽

如你想執行啓動/拆卸的代碼做爲你服務器的啓動或者關閉,你可使用如下幾種監聽模式:

  • before_server_start
  • after_server_start
  • before_server_stop
  • after_server_stop

這些監聽的方式被做爲裝飾在接收app項目也異步循環的功能函數的裝飾器

from sanic import Sanic

# 實例化一個Sanic對象
app = Sanic(__name__) @app.listener("before_server_start") async def setup_db(app, loop): app.db = await db_setupb() @app.listener("after_server_start") async def notify_server_started(app, loop): print("Server successfully started!") @app.listener("before_server_stop") async def notify_server_stopping(app, loop): print("Server shutting down!") @app.listener("after_server_stop") async def close_db(app, loop): await app.db.close()

監聽一樣也能夠用register_listener方法來註冊一個監聽者,若是你定義你的監聽者在另外一個模塊中,此外在你實例化你的app中.

from sanic import Sanic

# 實例化一個Sanic對象
app = Sanic() async def setup_db(app, loop): app.db = await db_setup() app.register_listener(setup_db, "before_server_start") # 註冊監聽者(在服務啓動前) 

若是要計劃在循環啓動後運行後臺任務,Sanic提供了add_task方法很容易啓動後臺程序.

from sanic import Sanic
import asyncio # 實例化Sanic對象 app = Sanic() async def notify_server_started_after_five_second(): await asyncio.sleep(5) print("Server successfully started!") # 用app來增長異步功能函數的任務 app.add_task(notify_server_started_after_five_second())

Sanic將會嘗試去自動的 諸如到app中,做爲一個參數添加到任務中.

import asyncio
from sanic import Sanic # 實例化一個Sanic對象 app = Sanic() async def notify_server_started_after_five_second(app): await asyncio.sleep(5) print(app.name) # 用app來增長異步函數功能 app.add_task(notify_server_started_after_five_second)

或者你能夠明確地做用於app,也是同樣的效果.

from sanic import Sanic
import asyncio # 實例化一個Sanic對象 app = Sanic() async def notify_server_started_after_five_seconds(app): await asyncio.sleep(5) print(app.name) app.add_task(notify_server_started_after_five_seconds(app))
相關文章
相關標籤/搜索