1. 程式人生 > >sanic官方文檔解析之路由

sanic官方文檔解析之路由

運行 指定 str 不用 image 請求方法 路徑 收發消息 什麽

1,路由,路由相當於一個網址的地址,來確定網址的位置和唯一性

技術分享圖片

當http://server.url/被允許訪問服務器,當最後的"/"通過路由匹配到了業務邏輯處理的函數,將會返回一個json對象

Sanic處理函數必須被定義使用async def語法,作為異步處理的函數

  • 1.1請求參數的處理(Request Parametres)

技術分享圖片

Sanic框架天生自帶一個基本的支持參數的路由

為了特殊的參數,支持引用尖括號來攜帶參數類似:<PARAM>,請求參數將會被通過路由處理函數作為關鍵字參數

  • 1.2參數的特殊類型

技術分享圖片

參數的特殊形式在後邊增加一個,參數的數據類型(:type)在參數的後邊,尖括號的裏邊,如果參數和數據類型不匹配,Sanic框架會拋出一個NotFound的例子,會在url上顯示404: Page not found

這個int和 number有什麽區別,未完待續...?

這個[A-z]和[A-z]+和[A-z0-9]{0,4}應該是和正則匹配的規則是一致的,未完待續...?

  • 1.3HTTP請求的方式

技術分享圖片

通常,一個路由定義一個URL將會被可用的僅僅只能為get請求,然而,這個@app.route裝飾器接收一組可供選擇的參數,請求方法,在列表;寫哪一個請求的方法,就會運行哪一個請求的方法.

技術分享圖片

路由裏還有一個可選的host參數(可以是列表或者是一個字符串),嚴格的提供host或者hosts,如果沒有host,將是默認是host.

技術分享圖片

也有一些快鍵的路由指定請求的方式,直接定義騎牛的方式,@app.get,@app.post.

  • 1.4增加路由的方法

技術分享圖片

正如我們所見,路由京城被特殊的用作@app.route,裝飾器,然而,這樣的裝飾器已經缺失裝飾了app.add_route,被做作為一個追隨者.,具體使用如上圖

  • 1.5,用url_for建立url

技術分享圖片

Sanic框架提供了一個url_for方法,是基於處理方法名稱去生成url,如果你想避免在你的app中編碼url的路徑,你可以參考以上的處理名字.(對求的參數可以做判斷篩選)內部跳轉,不用客戶端再發一次請求了,類似namespace

技術分享圖片

一下這幾種情況牢記要使用url_for

  • 通過url_for沒有請求參數的關鍵字參數將會被包含在查詢的url中
  • 多個值的參數將會通過url_for來設置路由

技術分享圖片

  • 還有一些特殊的參數(_anchor, _external, _scheme, _method, _server)通過url_for將會有特殊的url建立的方法(_method現在和你支持這樣的操作並且將會忽略)
  • 所有有效的參數必須通過url_for去建立URL,如果沒有供給一個參數,或者 參數和數據類型不搭配,將會拋出一個URLBuildError的錯誤
  • 1.6websocket通信路由

技術分享圖片

Websocket協議的路由能夠被@app.websocket裝飾(直接在裝飾器中,在視圖函數中收發消息)

技術分享圖片

app.add_websocket_route這個方法可以被用作路由的裝飾器

用請求的第一個參數處理Websocket路由被調用,並且W二本socket協議對象作為第二個參數,這個Websocket協議對象能夠分別的接受和發送數據

  • 1.7關於路由斜線的說明
from sanic import Sanic, Blueprint
from sanic.response import text

# 實例化一個Sanic對象
# 為所有的提供路由提供斜線的配置
app = Sanic("test_route_strict_slash", strict_slashes=True)
# 你可以為特殊的路由設置斜線


@app.get("/get", strict_slashes=False)
def handler(request):
    return text("ok")

# 也可以為藍圖設置斜線的配置
bq = Blueprint("test_bq_strict_slash", strict_slashes=True)

@bq.get("/bq/get", strict_slashes=False)
def handler(request):
    return text("ok")

app.blueprint(bq)
  • 使用定義的路由的名字

技術分享圖片

通過有一個name的參數被用來習慣性的設置成路由的名字,與此同時註冊側路由用handler.__name__的屬性重寫默認的路由的名字

from sanic import Sanic, Blueprint
from sanic.response import text


# 實例化一個Sanic對象
app = Sanic("test_named_route")


@app.get("/get", name="get_handler")  # 給這個路由重命名
def handler(request):
    return text("ok")

# 你需要使用app.url_for("get_handler")來反向解析這個路由
# 代替app.url_for("handler")


# 同樣也為藍圖工作
bq = Blueprint("test_named_bq")


@bq.get("/bq/get", name="get_handler")
def handler(request):
    return text("ok")


app.blueprint(bq)


# 你需要使用app.url_for("test_named_bq.get_handler)
# 代替app.url_for("handler)
# 不同的名稱和不同的方法都能夠被用於同一個url中

@app.get("/test", name="route_test")
def handler(request):
    return text("ok")


@app.post("/test", name="route_test")
def handler2(request):
    return text("ok POST")

@app.put("/test", name="route_put")
def handler3(request):
    return text("ok put")


# 在url相同的情況下,你可以使用以上三只中方法中的任何一個
app.url_for("route_test")


# 用不同的方法處理在路由重命名一樣
# 你需要一個特殊的命名
@app.get("/get")
def handler(request):
    return text("ok")


@app.post("/post", name="post_handler")
def handler(request):
    return text("ok")
  • 1.8為靜態文件設置url

技術分享圖片

Sanic支持使用url_for的方法去建立靜態文件的url,如果萬一靜態的文件指向了一個字典,這個url_for會忽略文件的參數

sanic官方文檔解析之路由