1,異常服務器
異常是從處理請求內部拋出來的,而且經過Sanic自動的被處理異常,,異經常使用第一個參數攜帶異常信息,還能夠接受在HTTP響應中要傳遞迴的狀態代碼。引起異常app
自動觸發異常,,簡單的額使用raise從sanic.exceptions的模塊中拋出相關的異常便可異步
你也可使用停止函數的狀態碼,來拋異常 ,如上圖所示:xss
@app.exception被使用來重寫處理默認的異常,,這個裝飾器指望一系列的異常做爲參數去處理,你能夠經過SanicException去抓住異常,裝飾異常處理函數必須攜帶請求和異常對象在參數中.async
你也能夠增長異常處理.函數
有些狀況下,,你也許想添加一些更詳細的錯誤信息處理函數,能夠默認提供,在那種狀況下,你能夠對Sanic的錯誤語法進行子類的劃分. oop
一些有用的例外,目前如上所示:spa
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")
中間件可以修改給定的請求和響應的參數,只要中間件沒有返回請求或者響應
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響應的時候調用
若是中間件返回一個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,監聽
如你想執行啓動/拆卸的代碼做爲你服務器的啓動或者關閉,你可使用如下幾種監聽模式:
這些監聽的方式被做爲裝飾在接收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))