Python Falcon - 路由
Falcon 采用 RESTful 架构风格。 因此,它使用基于资源的路由。 资源类负责处理响应者的 HTTP 方法,这些方法本质上是名称以 on_ 开头并以小写的 HTTP 方法名称结尾的类方法(例如,on_get()、on_patch()、on_delete( ), 等)。 Falcon Application 对象的 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 工具测试 http://localhost: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 − 参数的最大允许值。
Where,
例如,下面的 add_route() 函数接受 1 到 100 之间的整数作为 rollno。
app.add_route('/student/{rollno:int(1,1,100}', StudentResource())
UUIDConverter − falcon.routing 模块中的此类将 32 位十六进制数字的字符串转换为 UUID(通用唯一标识符)。
DateTimeConverter − 将参数字符串转换为日期时间变量。 参数必须是 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 |
| %-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 http://localhost: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"
}
您还可以在浏览器中检查响应,如下所示 −

