Python Falcon - 路由



Falcon 採用 RESTful 架構風格。因此它使用基於資源的路由。資源類負責透過響應器處理 HTTP 方法,響應器本質上是名稱以 on_ 開頭並以小寫 HTTP 方法名稱結尾的類方法(例如,on_get()、on_patch()、on_delete() 等)。Falcon 應用物件的 add_route() 方法將其路由器與資源類的例項關聯。

在上例 Hellofalcon.py 中,當客戶端分別使用 GET 和 POST 方法請求 /hello 路由時,將呼叫 on_get()on_post() 響應器。

如果沒有任何路由匹配請求,則會引發 HTTPRouteNotFound 例項。另一方面,如果路由匹配但資源未為請求的 HTTP 方法實現響應器,則預設響應器會引發 HTTPMethodNotAllowed 例項。

欄位轉換器

Falcon 的路由機制允許 URL 將引數傳遞給響應器。URL 包含三個部分:協議(例如 http://https://),後跟 IP 地址或主機名。主機名後第一個 / 後面的 URL 剩餘部分稱為路徑或端點。要傳遞的引數位於端點之後。

Routing

這充當資源識別符號,例如唯一 ID 或主鍵。引數名稱用花括號括起來。路徑引數的值除了請求和響應外,還會傳遞給響應器方法中定義的引數。

在下面的示例中,路由器將資源類物件與包含端點後引數的 URL 關聯。

from waitress import serve
import falcon
import json
class HelloResource:
   def on_get(self, req, resp, nm):
      """Handles GET requests"""
      resp.status = falcon.HTTP_200
      resp.content_type = falcon.MEDIA_TEXT
      resp.text = (
         'Hello '+nm
      )
app = falcon.App()
hello = HelloResource()
app.add_route('/hello/{nm}', hello)
if __name__ == '__main__':
   serve(app, host='0.0.0.0', port=8000)

我們可以看到,on_get() 響應器方法有一個額外的引數 nm 來接受從 URL 路由解析的資料。讓我們使用 HTTPie 工具測試 https://:8000/hello/Priya

>http GET localhost:8000/hello/Priya
HTTP/1.1 200 OK
Content-Length: 11
Content-Type: text/plain; charset=utf-8
Date: Mon, 18 Apr 2022 12:27:35 GMT
Server: waitress
Hello Priya

路徑引數解析到的預設資料型別為 str(即字串)。但是,Falcon 的路由引擎具有以下內建欄位轉換器,可以使用它們將其讀入其他資料型別。

  • IntConverter - 此類在 falcon.routing 模組中定義。建構函式使用以下引數:

IntConverter(num_digits=None, min=None, max=None)

    其中:

    • num_digits - 值必須具有給定的位數。

    • min - 引數的最小所需值

    • max - 引數的最大允許值。

    例如,以下 add_route() 函式接受 1 到 100 之間的整數作為 rollno

app.add_route('/student/{rollno:int(1,1,100}', StudentResource())
  • UUIDConverter - falcon.routing 模組中的此類將 32 個十六進位制數字的字串轉換為 UUID(通用唯一識別符號)。

  • DateTimeConverter - 將引數字串轉換為 datetime 變數。引數必須是任何被 strptime() 函式識別的格式的字串,預設為 '%Y-%m-%dT%H:%M:%SZ'

格式字串使用以下格式程式碼:

%a 縮寫星期幾名稱 Sun, Mon
%A 完整星期幾名稱 Sunday, Monday
%d 月份中的日期,以零填充的十進位制表示 01, 02
%-d 月份中的日期,以十進位制表示 1, 2..
%b 縮寫月份名稱 Jan, Feb
%m 月份,以零填充的十進位制表示 01, 02
%B 完整月份名稱 January, February
%-y 不帶世紀的年份,以十進位制表示 0, 99
%Y 帶世紀的年份,以十進位制表示 2000, 1999
%H 小時(24 小時制),以零填充的十進位制表示 01, 23
%p 區域設定的 AM 或 PM AM, PM
%-M 分鐘,以十進位制表示 1, 59
%-S 秒,以十進位制表示 1, 59

在下面的示例中,add_route() 函式將一個 URL 與兩個引數與 Resource 物件關聯。第一個引數 nm 預設是字串。第二個引數 age 使用 IntConverter

from waitress import serve
import falcon
import json
class HelloResource:
   def on_get(self, req, resp, nm,age):
      """Handles GET requests"""
      retvalue={"name":nm, "age":age}
      resp.body=json.dumps(retvalue)
      resp.status = falcon.HTTP_200 
      resp.content_type = falcon.MEDIA_JSON
app = falcon.App()
hello = HelloResource()
app.add_route('/hello/{nm}/{age:int}', hello)
if __name__ == '__main__':
   serve(app, host='0.0.0.0', port=8000)

請注意,on_get() 響應器使用路徑引數來形成一個 dict 物件 – retvalue。然後,它的 JSON 表示形式被指定為響應正文的值並返回給客戶端。如前所述,JSON 是 Falcon 響應物件的預設內容型別。

啟動 Waitress 伺服器並使用 HTTPie 檢查 URL https://:8000/hello/Priya/21 的響應。

http GET localhost:8000/hello/Priya/21
HTTP/1.1 200 OK
Content-Length: 28
Content-Type: application/json
Date: Fri, 22 Apr 2022 14:22:47 GMT
Server: waitress {
   "age": 21,
   "name": "Priya"
}

您也可以在瀏覽器中檢查響應,如下所示:

Routing Hello
廣告
© . All rights reserved.