Python Falcon 路由

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的剩余部分被称为路径或端点。要传递的参数在端点之后。

Python Falcon - 路由

这作为一个资源标识符,如唯一的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 – 该参数的最大允许值。

例如,下面的 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 缩略的工作日名称 星期日,星期一
%A 完整的工作日名称 星期日,星期一
%d 以零填充的小数形式表示的月份的日期 01, 02
%-d 以小数形式表示的月日 1, 2..
%b 缩略的月份名称 一月,二月
%m 作为零填充的十进制数字的月份 01, 02
%B 完整的月份名称 一月,二月
%-y 不含世纪的十进制数字的年份 0, 99
%Y 以世纪为小数的年份 2000, 1999
%H 小时(24小时时钟),作为一个零填充的十进制数字 01, 23
%p 当地的上午或下午 AM, PM
%-M 分钟为小数点后的数字 1, 59
%-S 秒为小数点后的数字 1, 59

在下面的例子中, add_route() 函数将一个带有两个参数的URL与资源对象联系起来。第一个参数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"
}

你也可以在浏览器中检查响应,如下所示

Python Falcon - 路由

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程