- 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://127.0.0.1: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://127.0.0.1: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" }
您也可以在浏览器中检查响应,如下所示: