- Python Falcon 教程
- Python Falcon - 首頁
- Python Falcon - 簡介
- Python Falcon - 環境設定
- Python Falcon - WSGI vs ASGI
- Python Falcon - Hello World (WSGI)
- Python Falcon - Waitress
- Python Falcon - ASGI
- Python Falcon - Uvicorn
- Python Falcon - API 測試工具
- 請求 & 響應
- Python Falcon - 資源類
- Python Falcon - 應用類
- Python Falcon - 路由
- Falcon - 字尾響應器
- Python Falcon - Inspect 模組
- Python Falcon - Jinja2 模板
- Python Falcon - Cookie
- Python Falcon - 狀態碼
- Python Falcon - 錯誤處理
- Python Falcon - Hook
- Python Falcon - 中介軟體
- Python Falcon - CORS
- Python Falcon - WebSocket
- Python Falcon - SQLAlchemy 模型
- Python Falcon - 測試
- Python Falcon - 部署
- Python Falcon 有用資源
- Python Falcon - 快速指南
- Python Falcon - 有用資源
- Python Falcon - 討論
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 剩餘部分稱為路徑或端點。要傳遞的引數位於端點之後。
這充當資源識別符號,例如唯一 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"
}
您也可以在瀏覽器中檢查響應,如下所示: