Python Falcon 简明教程
Python Falcon - Routing
Falcon 采用 RESTful 架构样式。因此,它使用基于资源的路由。资源类负责通过响应器处理 HTTP 方法,响应器本质上是类方法,名称以 on_ 开头,以小写 HTTP 方法名称结尾(例如, on_get(), on_patch(), on_delete(), 等)。Falcon 应用程序对象的 add_route() 方法将其路由器与其资源类的实例相关联。
在上面使用的 Hellofalcon.py 示例中, on_get() 和 on_post() 响应器在客户端通过 GET 和 POST 方法请求 /hello 路由时被调用。
如果没有路由与请求相匹配,则会引发 HTTPRouteNotFound 的实例。另一方面,如果匹配到路由,但资源并未实现对所请求 HTTP 方法的响应器,则默认响应器将引发 HTTPMethodNotAllowed 的实例。
Field Converters
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 的路由引擎有以下 built-in field converters ,可以使用它们将它们读取到其他数据类型中。
-
IntConverter − 此类定义在 falcon.routing 模块中。构造函数使用以下参数 −
IntConverter(num_digits=None, min=None, max=None)
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 |
Abbreviated weekday name |
Sun, Mon |
%A |
Full weekday name |
Sunday, Monday |
%d |
以零填充的十进制数表示的月中天数 |
01, 02 |
%-d |
以十进制数表示的月中天数 |
1, 2.. |
%b |
Abbreviated month name |
Jan, Feb |
%m |
以零填充的十进制数表示的月份 |
01, 02 |
%B |
Full month name |
January, February |
%-y |
以十进制数表示的无世纪年份 |
0, 99 |
%Y |
以十进制数表示的含世纪年份 |
2000, 1999 |
%H |
以零填充的十进制数表示的 24 小时时间中的小时数 |
01, 23 |
%p |
locale’s AM or 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 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"
}
你还可以使用浏览器中查看响应,如下所示 −