Skip to main content

特殊路由匹配机制

什么是特殊路由匹配机制?

通常来说 匹配机制 有:

  • 全等匹配:-
  • 头部匹配:-
  • 尾部匹配:-
  • 局部匹配:判断是否满足局部匹配
  • 正则匹配:判断是否满足正则匹配

在路由管理中,包含多种匹配模式的机制我们都称之为特殊路由匹配机制。

特殊路由匹配机制 是现代 web 框架必不可少的特点。

对于大多数的框架而言,它们都支持正则匹配,虽然这会带来更丰富的能力,但这无疑也会引入一定的性能问题。

Pywss 通过更简单、轻量的方式实现了三种路由匹配机制,包括:

匹配机制说明
全等匹配app.get("/full/match", handler)
局部匹配app.get("/party/match/{name}", handler),详情见 局部匹配
头部匹配app.get("/head/match/*", handler),详情见 头部匹配

注意: 上述匹配机制无法同时生效,且存在优先级,即 全等匹配 > 局部匹配 > 头部匹配

全等匹配此处不在赘述。下面主要介绍:

  • 局部匹配
  • 头部匹配

局部匹配

Pywss 在配置路由时,通过 大括号 区分 局部匹配

在使用 局部匹配 时,会生成指定的 "路由参数",此参数存储在 ctx.route_params 中。

获取路由参数
import pywss

def hello(ctx: pywss.Context):
name = ctx.route_params["name"]
ctx.write({"hello": name})

app = pywss.App()
app.any("/hello/{name}", hello)
app.run()

局部匹配 不支持类型校验,即默认是字符串类型。

理论上来讲,通过类型校验可以实现更加丰富的路由机制,比如:

路由类型校验
"/api/v1/user/name/{name: any}"
"/api/v1/user/age/{age: int}"

这种看似很秀,实则意义不大。

因为在这种模式下,"/api/v1/user/age/unknown" 将不会命中任何路由,但实际只是用户使用方式不对而已,这会造成困惑。

Pywss 更希望用户能够收到类似 {"errMsg": "'unknown' is invalid of age"} 的错误信息。

头部匹配

Pywss 在配置路由时,通过尾部配置 * 可以区分 头部匹配

头部匹配
import pywss

def hello(ctx: pywss.Context):
name = ctx.route.replace("/hello/", "", 1)
ctx.write({"hello": name})

app = pywss.App()
app.any("/hello/*", hello)
app.run()

在此模式下,任意以 /route/ 开头的路由均可以命中此路由。