您好,登錄后才能下訂單哦!
如何在Sanic框架中使用路由?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
簡介
Sanic是一個類似Flask的Python 3.5+ Web服務器,它的寫入速度非常快。除了Flask之外,Sanic還支持異步請求處理程序。這意味著你可以使用Python 3.5中新的閃亮的異步/等待語法,使你的代碼非阻塞和快速。
前言:Sanic最低支持Python 3.5,如果需要學習Sanic,請先下載版本不低于3.5的Python包
路由
路由允許用戶為不同的URL端點指定不同的處理函數,我們取出上一篇《Sanic框架安裝與簡單入門》的路由為例:
from sanic.response import json @app.route("/") async def hello_sanic(request): data = json({"code":0}) return data
當我們在瀏覽器輸入http://localhost:5000/時,根據路由匹配到處理函數hello_sanic
,最終返回JSON對象。Sanic處理函數必須使用語法async def
來定義,因為它們是異步行數。
請求參數
Sanic處理函數帶有一個支持請求的參數,即上面的request
參數。如果需要制定一個參數,我們可以使用尖角括號將其括起來,如下所示:
from sanic.response import json @app.route("/hello/<name>") async def hello(request,name): return json({"name":name})
此時我們再瀏覽器輸入:http://localhost:5000/hello/laowang時,Sanic將會根據路由匹配處理函數,從而返回數據。此時,我們需要對參數進行指定類型,可以在路由中的參數后面加上:type
,假設傳入一個age參數,為int類型,路由可以這么寫:/hello/<age:int>
。代碼如下:
from sanic.response import json @app.route("/hello/<age:int>") async def hello_age(request,age): return json({"age":age})
此時就可以指定用戶傳入指定類型的參數了,如果類型不對,將報404錯誤。
請求類型
對于Sanic處理網絡請求,也舉了不少例子,可是這些都是GET請求,那我們該如何定義一個POST請求呢?與Flask相同,@app.route
支持一個可選參數methods
,methods
可傳入一個列表類型,如此,它將允許處理函數使用列表中的任何HTTP方法。
from sanic.response import json @app.route("/post/json_data",methods=["POST"]) async def post_json(request): """ POST請求 json數據 """ return json(request.json) @app.route("/post/form_data",methods=["POST"]) async def post_form(request): """ POST請求 form表單數據 """ return json(request.form) @app.route("/get/data",methods=["GET"]) async def get_data(request): """ GET請求 """ return json(request.args)
因為GET請求時默認的,所以,如果需要定義一個GET請求,那么methods參數可以無需傳遞。@app.route
還支持另一個可選參數host,這限制了一條到所提供的主機或主機的路由。
from sanic.response import text @app.route("/hello/host",host="abc.com") async def hello_host(request): return text("hello host")
在瀏覽器中訪問此路由,如果主機頭不匹配abc.com,那么將會報404錯誤。
路由的裝飾器寫法除了上面介紹的那種,還可以將其簡寫,如下所示:
from sanic.response import json @app.get("/short/get") async def short_get(request): return json(request.args) @app.post("/short/post") async def short_post(request): return json(request.json)
add_route方法
通常我們指定一個路由,都是通過@app.route
裝飾器,然而,這個裝飾器實際上只是這個add_route
方法的一個包裝器,使用方法如下:
async def add_get_route(request): """ 添加GET請求 """ return json(request.args) async def add_get_type_route(request,age): """ 添加帶指定類型的參數的GET請求 """ return json({"age":age}) async def add_post_route(request): """ 添加POST請求 """ return json(request.json) app.add_route(add_get_route,"/add_get_route") app.add_route(add_get_type_route,"/add_get_type_route/<age:int>") app.add_route(add_post_route,"/add_post_route",methods=["POST"])
重定向
Sanic提供了一個url_for基于處理程序方法名稱生成URL的方法。如果你想要避免將URL路徑硬編碼到你的應用程序當中,這很有用。例如:
from sanic.response import text,redirect @app.route("/url_info") async def url_info(request): url = app.url_for('post_handler',name="laozhang",arg_one="one",arg_two="two") print(url) return redirect(url) @app.route("/post_handler/<name>") async def post_handler(request,name): print(request.args) return text("name:{}".format(name))
url_for使用注意:第一個參數為重定向URL的路由名稱(默認為函數名稱),并非URL名稱。另外我們可以將一些請求參數指派到url_for方法中,上面例子重定向后的url將會是:
/post_handler/laozhang?arg_one=one&arg_two=two
也可以傳遞多值參數:
app.url_for("post_handler",favorite=["football","bastketball"]) # /post_handler?favorite=football&favorite=bastketball
唯一URL
在Flask中,我們頂一個一個URL
為/get
,此時我們訪問/get將可以訪問成功,如果輸入/get/
將會返回404錯誤,這就是唯一URL。在Sanic中同樣擁有此功能,我們可以通過配置strict_slashes
參數來實現:
from sanic.response import text @app.route("/get",strict_slashes=True) async def get(request): return text("it is ok!")
注意:strict_slashes
默認值為None,如果不設置的話,訪問/get
或/get/
都將可以訪問成功,那么這就不是唯一URL了。在上面的例子中,我們將此值設置為True,此時我們輸入/get/
,將會返回一個404錯誤,這樣就完成了一個唯一URL的實現。
如果我們需要將所有的URL都設置成為唯一URL,我們可以這樣:
from sanic import Sanic from sanic.response import text app = Sanic(strict_slashes=True) @app.route("/hello") async def hello(request): return text("it is ok!") @app.route("/world") async def world(request): return text("it is ok!")
/hello
和world
都變成了唯一URL。
如果我們只需要部分URL設置成唯一URL,我們可以在@app.route
裝飾器中傳入strict_slashes
,并設置為Flase,那么此URL將不是唯一URL。或者我們也可以定義一個藍圖,如下:
from sanic import Blueprint ss_bp = Blueprint("aaa",strict_slashes=False) @ss_bp.route("/world") async def world(request): return text("it is ok!") app.blueprint(ss_bp)
即使你在app中傳遞了參數strict_slashes=True
,那么也沒有用,所有通過此藍圖定義的URL都將不是唯一URL。
自定義路由名稱
通常一個路由的名稱為程序處理方法名稱,即函數.__name__
生成的,用于可以傳遞一個name參數到裝飾器中來修改它的名稱,如下:
from sanic.response import text @app.route("/get",name="get_info") async def get(request): return text("it is ok!")
此時url_for
中傳遞的將不是函數名稱,而是name的值:
print(app.url_for("get_info")) # /get
同樣,也適用于藍圖:
from sanic import Blueprint ss_bp = Blueprint("test_bp") @ss_bp.route("/get",name="get_info") async def get(request): return text("it is ok!") app.blueprint(ss_bp) print(app.url_for("test_bp.get_info"))
靜態文件的URL
我們需要構建一個特定的URL來訪問我們需要的HTML,此時我們可以這樣:
from sanic import Sanic,Blueprint app = Sanic() app.static("/home","./static/home.html")
此時我們在訪問/home
就可以鏈接到我們指定的HTML中了,此方法同樣適用于藍圖。
CompositionView
除了上面那幾種定義路由的方法之外,Sanic還提供了CompositionView
來動態添加路由:
from sanic.views import CompositionView from sanic.response import text async def post_handler(request): print(request.json) return text('it is ok!') view = CompositionView() view.add(["POST"],post_handler) app.add_route(view,"/post_info")
如此,就構造了一個POST請求的接口
處理器裝飾器
由于Sanic處理程序是簡單的Python函數,因此可以用與Flask類似的修飾符應用于它們。一個典型的用例就是當一些代碼想要在處理程序的代碼執行之前執行:
from sanic.response import text def is_authorized(): return True def authorized(func): async def wrapper(request,*args,**kwargs): is_auth = is_authorized() if is_auth: response = await func(request,*args,**kwargs) return response else: return text("it is not authorized") return wrapper @app.route("/get_user_info") @authorized async def get_user_info(request): return text("get_user_info")
關于如何在Sanic框架中使用路由問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。