欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Sanic框架異常處理與中間件操作實(shí)例分析

 更新時(shí)間:2018年07月16日 11:21:14   作者:噴跑的豆子  
這篇文章主要介紹了Sanic框架異常處理與中間件操作,結(jié)合實(shí)例形式較為詳細(xì)的分析了Sanic框架拋出異常、異常處理、中間件、監(jiān)聽(tīng)器相關(guān)原理與操作技巧,需要的朋友可以參考下

本文實(shí)例講述了Sanic框架異常處理與中間件操作。分享給大家供大家參考,具體如下:

簡(jiǎn)介

Sanic是一個(gè)類(lèi)似Flask的Python 3.5+ Web服務(wù)器,它的寫(xiě)入速度非???。除了Flask之外,Sanic還支持異步請(qǐng)求處理程序。這意味著你可以使用Python 3.5中新的閃亮的異步/等待語(yǔ)法,使你的代碼非阻塞和快速。

前言Sanic最低支持Python 3.5,如果需要學(xué)習(xí)Sanic,請(qǐng)先下載版本不低于3.5的Python包

異常

異??梢詮恼?qǐng)求處理程序中拋出,并由Sanic自動(dòng)處理。異常將消息作為第一個(gè)參數(shù),并且還可以將狀態(tài)碼傳回HTTP響應(yīng)中。

拋出異常:手動(dòng)產(chǎn)生異常的方式,有過(guò)Python基礎(chǔ)的都知道,可以使用raise來(lái)產(chǎn)生一個(gè)異常:

from sanic.exceptions import ServerError
from sanic.response import text
@app.route("/get_exception")
async def get_exception(request):
  raise ServerError("it is error",status_code=500)

你也可以使用abort:

from sanic.exceptions import abort
from sanic.response import text
@app.route("/get_exception")
async def get_exception(request):
  abort(402)
  text("ok")

處理異常:有時(shí)我們需要對(duì)一些特殊異常做特殊處理,此時(shí)我們可以用到@app.exception裝飾器,然后在定義一個(gè)異常函數(shù)來(lái)進(jìn)行處理。異常裝飾器處理函數(shù)必須以一個(gè)RequestException對(duì)象作為參數(shù):

from sanic.response import text
from sanic.exceptions import NotFound
@app.exception(NotFound)
async def not_found_exception(request,exception):
  return text("not found=>{}".format(request.url))

中間件

中間件是服務(wù)器在請(qǐng)求之前或之后執(zhí)行的功能,他們可以用來(lái)修改修改用戶(hù)定義處理函數(shù)的請(qǐng)求或相應(yīng)。Sanic提供兩種類(lèi)型的中間件:請(qǐng)求和響應(yīng)。兩者都是使用@app.middleware裝飾器聲明,兩個(gè)裝飾器分別需要傳入一個(gè)代表其類(lèi)型的參數(shù):requestresponse,下面舉一個(gè)簡(jiǎn)單的栗子:

from sanic.response import text
@app.route("/get_info")
async def get_info(request):
  print(request.url)
  return text("it is ok!")
@app.middleware("request")
async def get_request_middleware(request):
  print("請(qǐng)求中間件")
@app.middleware("response")
async def get_response_middleware(request,response):
  print("響應(yīng)中間件")

當(dāng)我們?cè)L問(wèn)/get_info請(qǐng)求時(shí),打印結(jié)果將會(huì)是這樣的:

請(qǐng)求中間件

http://localhost:5000/get_info

響應(yīng)中間件

值得注意的是,如果是響應(yīng)中間的處理函數(shù),除了需要傳遞一個(gè)request對(duì)象參數(shù),還需要傳遞一個(gè)response對(duì)象參數(shù)。從結(jié)果可以看出,request中間件是在接收到請(qǐng)求時(shí)立馬觸發(fā)的,而response中間件是在接收到響應(yīng)時(shí)立馬觸發(fā)的。針對(duì)這兩者的特性,我們可以進(jìn)行一些特殊的操作,來(lái)達(dá)到我們的目的:

@app.middleware("request")
async def get_request_middleware(request):
  request.args.update({"name":"laozhang"})
@app.middleware("response")
async def get_response_middleware(request,response):
  response.headers["name"] = "laozhang"

將所有的請(qǐng)求的args添加一條name=laozhang,并且在響應(yīng)頭中添加name=laozhang

監(jiān)聽(tīng)器

如果需要在服務(wù)器啟動(dòng)/關(guān)閉的時(shí)候,執(zhí)行一些特殊的代碼,則可以使用以下監(jiān)聽(tīng)器:

  • before_server_start:在服務(wù)器啟動(dòng)之前執(zhí)行
  • after_server_start:在服務(wù)器啟動(dòng)之后執(zhí)行
  • before_server_stop:在服務(wù)器關(guān)閉之前執(zhí)行
  • after_server_stop:在服務(wù)器關(guān)閉之后執(zhí)行

舉個(gè)栗子:

@app.listener("before_server_start")
async def before_server_start(request,loop):
  print("before_server_start")
@app.listener("after_server_start")
async def after_server_start(request,loop):
  print("after_server_start")
@app.listener("before_server_stop")
async def before_server_stop(request,loop):
  print("before_server_stop")
@app.listener("after_server_stop")
async def after_server_stop(request,loop):
  print("after_server_stop")

現(xiàn)在先啟動(dòng)服務(wù),而后關(guān)閉,發(fā)現(xiàn)執(zhí)行的順序?qū)?huì)是這樣:

before_server_start
after_server_start
before_server_stop
after_server_stop

更多關(guān)于Python相關(guān)內(nèi)容可查看本站專(zhuān)題:《Python入門(mén)與進(jìn)階經(jīng)典教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python文件與目錄操作技巧匯總

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Python基礎(chǔ)學(xué)習(xí)列表+元組+字典+集合

    Python基礎(chǔ)學(xué)習(xí)列表+元組+字典+集合

    這篇文章主要介紹了Python基礎(chǔ)學(xué)習(xí)列表+元組+字典+集合,文章接上一篇內(nèi)容學(xué)習(xí),主要針對(duì)python零基礎(chǔ)的同學(xué),感興趣的話(huà)就學(xué)起來(lái)吧
    2022-05-05
  • Python實(shí)現(xiàn)繪制水平線

    Python實(shí)現(xiàn)繪制水平線

    這篇文章主要為大家詳細(xì)介紹如何了在Python中創(chuàng)建一條水平線以及Python?中的?Matplotlib?庫(kù)的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2023-10-10
  • Python全棧之學(xué)習(xí)HTML

    Python全棧之學(xué)習(xí)HTML

    這篇文章主要為大家介紹了Python全棧之HTML,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • python通過(guò)ElementTree操作XML獲取結(jié)點(diǎn)讀取屬性美化XML

    python通過(guò)ElementTree操作XML獲取結(jié)點(diǎn)讀取屬性美化XML

    本文講解如何通過(guò)ElementTree解析XML,獲取兒子結(jié)點(diǎn)、插入兒子結(jié)點(diǎn)、操作屬性、美化XML
    2013-12-12
  • Python程序打包成可執(zhí)行文件exe詳解流程

    Python程序打包成可執(zhí)行文件exe詳解流程

    你是否也有希望過(guò)寫(xiě)一些自己所需要的工具程序來(lái)使用,可有不想或者沒(méi)時(shí)間精力學(xué)別的語(yǔ)言,本篇文章教你如何將用python語(yǔ)言寫(xiě)的程序打包成可執(zhí)行的exe文件
    2021-11-11
  • Python可視化神器pyecharts繪制?;鶊D

    Python可視化神器pyecharts繪制桑基圖

    這篇文章主要介紹了Python可視化神器pyecharts繪制?;鶊D,即?;芰糠至鲌D,也叫?;芰科胶鈭D,更多相關(guān)介紹具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • python圖像處理基本操作總結(jié)(PIL庫(kù)、Matplotlib及Numpy)

    python圖像處理基本操作總結(jié)(PIL庫(kù)、Matplotlib及Numpy)

    這篇文章主要給大家介紹了關(guān)于python圖像處理基本操作的相關(guān)資料,主要利用的是PIL庫(kù)、Matplotlib及Numpy等處理方法,需要的朋友可以參考下
    2021-06-06
  • PHP統(tǒng)計(jì)代碼行數(shù)的小代碼

    PHP統(tǒng)計(jì)代碼行數(shù)的小代碼

    這篇文章主要為大家詳細(xì)介紹了PHP統(tǒng)計(jì)代碼行數(shù)的小代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • 詳解Python中最常用的10個(gè)內(nèi)置函數(shù)

    詳解Python中最常用的10個(gè)內(nèi)置函數(shù)

    Python作為一種多用途編程語(yǔ)言,擁有豐富的內(nèi)置函數(shù)庫(kù),這些函數(shù)可以極大地提高開(kāi)發(fā)效率,本文將介紹Python中最常用的10個(gè)內(nèi)置函數(shù),我們將深入了解每個(gè)函數(shù),并提供示例代碼以幫助您更好地理解它們,需要的朋友可以參考下
    2023-11-11
  • python2.7使用plotly繪制本地散點(diǎn)圖和折線圖

    python2.7使用plotly繪制本地散點(diǎn)圖和折線圖

    這篇文章主要為大家詳細(xì)介紹了python2.7使用plotly繪制本地散點(diǎn)圖和折線圖實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04

最新評(píng)論