Sanic框架藍(lán)圖用法實(shí)例分析
本文實(shí)例講述了Sanic框架藍(lán)圖用法。分享給大家供大家參考,具體如下:
藍(lán)圖是可以用于應(yīng)用程序內(nèi)子路由的對(duì)象。藍(lán)圖并未向應(yīng)用程序內(nèi)添加路由,而是定義了用于添加路由的類(lèi)似方法,然后以靈活且可插入的方式向應(yīng)用程序注冊(cè)路由。
藍(lán)圖對(duì)于大型應(yīng)用程序尤其有用,您的應(yīng)用程序可以分解成為幾個(gè)小組或責(zé)任區(qū)域。
第一個(gè)藍(lán)圖
假設(shè)你在bp/bp_1.py文件下,定義了以下這么一個(gè)非常簡(jiǎn)單的藍(lán)圖:
from sanic import Blueprint from sanic.response import text bp = Blueprint("first_bp") @bp.route("/get_info") async def get_info(request): return text("it is ok!")
注冊(cè)藍(lán)圖
定義了一個(gè)藍(lán)圖之后,必須在應(yīng)用程序中注冊(cè):
from sanic import Sanic from bp.bp_1 import bp app = Sanic() app.blueprint(bp) if __name__ == "__main__": app.run()
如此,并將藍(lán)圖添加到應(yīng)用程序當(dāng)中,并注冊(cè)藍(lán)圖所定義的所有路由。此時(shí)我們就可以訪(fǎng)問(wèn)/get_info
就可以獲取到數(shù)據(jù)了
藍(lán)圖的使用
在前面一篇《Sanic框架異常處理與中間件操作》中簡(jiǎn)單介紹了一下在路由中如何使用中間件與異常以及監(jiān)聽(tīng)器等,這些東西在藍(lán)圖中同樣可以使用:
中間件:使用藍(lán)圖可以在全局范圍內(nèi)注冊(cè)中間件
@bp.route("/get_info") async def get_info(request): return text("get_info") @bp.middleware("request") async def handle_md_request(request): print("request middleware") @bp.middleware("response") async def handle_md_response(request,response): print("response middleware")
異常:使用藍(lán)圖可以在全局范圍內(nèi)注冊(cè)異常
from sanic.exceptions import NotFound @bp.exception(NotFound) async def handle_exception(request,exception): return text("404 exception")
靜態(tài)文件:靜態(tài)文件可以在藍(lán)圖前綴下全局提供
bp.static("/home","/aaa/bbb/abc.html")
監(jiān)聽(tīng)器:如果需要在服務(wù)器啟動(dòng)/關(guān)閉的時(shí)候,執(zhí)行一些特殊的代碼,則可以使用以下監(jiān)聽(tīng)器,可用的監(jiān)聽(tīng)器如下:
- before_server_start:在服務(wù)器開(kāi)始接收連接之前執(zhí)行
- after_server_start:在服務(wù)器開(kāi)始接收連接之后執(zhí)行
- before_server_stop:在服務(wù)器停止接收連接之前執(zhí)行
- after_server_stop:在服務(wù)器停止接收連接之后執(zhí)行
@bp.listener("before_server_start") async def before_server_start(request,loop): print("before server start") @bp.listener("after_server_start") async def after_server_start(request,loop): print("after server start") @bp.listener("before_server_stop") async def before_server_stop(request,loop): print("before server stop") @bp.listener("after_server_stop") async def after_server_stop(request,loop): print("after server stop")
當(dāng)服務(wù)器啟動(dòng)時(shí),將會(huì)依次打印如下信息:
before server start
after server start
當(dāng)服務(wù)器關(guān)閉時(shí),將會(huì)依次打印如下信息:
before server stop
after server stop
API版本控制
與手機(jī)APP對(duì)接的接口開(kāi)發(fā)中,API版本控制尤為重要,針對(duì)于低版本用戶(hù)(尚未升級(jí)版本的用戶(hù))所用的仍是舊的接口數(shù)據(jù),此時(shí)開(kāi)發(fā)新功能時(shí)對(duì)此模塊的數(shù)據(jù)需要進(jìn)行修改,可是不能影響舊版本的用戶(hù),此時(shí)我們就需要對(duì)API版本進(jìn)行控制。我們可以定義兩個(gè)藍(lán)圖,一個(gè)指向/v1/<route>
,另一個(gè)指向/v2/<route>
。當(dāng)藍(lán)圖初始化時(shí),我們可以采用一個(gè)可選參數(shù)url_prefix
,該參數(shù)將被置于藍(lán)圖定義的所有路由之上,這個(gè)特性可以來(lái)實(shí)現(xiàn)我們的API版本控制方案:
from sanic import Blueprint from sanic.response import text bp1 = Blueprint("bp1",url_prefix="/v1") bp2 = Blueprint("bp2",url_prefix="/v2") @bp1.route("/get_data") async def get_v1_data(request): return text("it is v1") @bp2.route("/get_data") async def get_v2_data(request): return text("it is v2")
此時(shí),我們已經(jīng)定義好了兩個(gè)藍(lán)圖來(lái)控制兩個(gè)版本,我們需要在app中注冊(cè)它們:
from sanic import Sanic from app.bp.bp_info import bp1,bp2 app = Sanic() app.blueprint(bp1) app.blueprint(bp2) if __name__ == "__main__": app.run()
重定向
在之前的博文中,我們講到可以使用url_for
基于處理程序方法名稱(chēng)生成URL,然后使用redirect
進(jìn)行重定向,在藍(lán)圖中同樣使用:
from sanic.response import text,redirect @bp.route("/") async def handle_root(request): # bp為定義藍(lán)圖實(shí)例中的name url = request.app.url_for("bp.get_info",name="laozhang") return redirect(url) @bp.route("/get_info/<name>") async def get_info(request,name): return text("name:{}".format(name))
更多關(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)文章
python3 實(shí)現(xiàn)對(duì)圖片進(jìn)行局部切割的方法
今天小編就為大家分享一篇python3 實(shí)現(xiàn)對(duì)圖片進(jìn)行局部切割的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12Python尋找兩個(gè)有序數(shù)組的中位數(shù)實(shí)例詳解
這篇文章主要介紹了Python尋找兩個(gè)有序數(shù)組的中位數(shù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-12-12python+selenium 簡(jiǎn)易地疫情信息自動(dòng)打卡簽到功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了python+selenium 簡(jiǎn)易地疫情信息自動(dòng)打卡簽到功能的實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08Python+?Flask實(shí)現(xiàn)Mock?Server詳情
這篇文章主要介紹了Python+?Flask實(shí)現(xiàn)Mock?Server詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09Python 中 AttributeError: ‘NoneType‘ obje
Python “AttributeError: ‘NoneType’ object has no attribute” 發(fā)生在我們嘗試訪(fǎng)問(wèn) None 值的屬性時(shí),例如 來(lái)自不返回任何內(nèi)容的函數(shù)的賦值, 要解決該錯(cuò)誤,請(qǐng)?jiān)谠L(fǎng)問(wèn)屬性之前更正分配,本文通過(guò)示例給大家說(shuō)明錯(cuò)誤是如何發(fā)生的,感興趣的朋友一起看看吧2023-08-08matplotlib 對(duì)坐標(biāo)的控制,加圖例注釋的操作
這篇文章主要介紹了matplotlib 對(duì)坐標(biāo)的控制,加圖例注釋的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04python實(shí)現(xiàn)將中文日期轉(zhuǎn)換為數(shù)字日期
這篇文章主要介紹了python實(shí)現(xiàn)將中文日期轉(zhuǎn)換為數(shù)字日期,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07使用python讀取txt文件的內(nèi)容,并刪除重復(fù)的行數(shù)方法
下面小編就為大家分享一篇使用python讀取txt文件的內(nèi)容,并刪除重復(fù)的行數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04Python3 使用cookiejar管理cookie的方法
今天小編就為大家分享一篇Python3 使用cookiejar管理cookie的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12python用線(xiàn)性回歸預(yù)測(cè)股票價(jià)格的實(shí)現(xiàn)代碼
這篇文章主要介紹了python用線(xiàn)性回歸預(yù)測(cè)股票價(jià)格的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09