Sanic 路由简介#
将处理程序连接到端点的最基本方法是使用 app.add_route()
。
async def handler(request):
return text("OK")
app.add_route(handler, "/test")
默认情况下,路由作为 HTTP GET 请求可用。您可以更改处理程序以响应一个或多个 HTTP 方法。
app.add_route(
handler,
'/test',
methods=["POST", "PUT"],
)
也可以直接使用装饰器:
@app.route('/test', methods=["POST", "PUT"])
async def handler(request):
return text('OK')
HTTP 方法#
每个标准 HTTP 方法都有方便的装饰器。
GET:
@app.get('/test') async def handler(request): return text('OK')
POST:
@app.post('/test') async def handler(request): return text('OK')
PUT:
@app.put('/test') async def handler(request): return text('OK')
-
@app.patch('/test') async def handler(request): return text('OK')
-
@app.delete('/test') async def handler(request): return text('OK')
HEAD:
@app.head('/test') async def handler(request): return text('OK')
-
@app.options('/test') async def handler(request): return text('OK')
警告
默认情况下,Sanic 只会在非安全的 HTTP 方法上消耗传入的请求体:POST、PUT、PATCH、DELETE。如果您希望在其他任何方法上接收 HTTP 请求中的数据,您需要执行以下两个选项之一:
选项#1 - 使用
ignore_body
告诉 Sanic 消耗请求体@app.request("/path", ignore_body=False) async def handler(_): ...
选项#2 - 在处理程序中使用
receive_body
手动消耗请求体@app.get("/path") async def handler(request: Request): await request.receive_body()
路径参数#
Sanic 允许进行模式匹配,并从 URL 路径中提取值。这些参数随后会作为关键字参数注入到路由处理程序中。
@app.get("/tag/<tag>")
async def tag_handler(request, tag):
return text(f"Tag - {tag}")
您可以声明参数的类型。这将在匹配时强制执行,并将对变量进行类型转换。
@app.get("/foo/<foo_id:uuid>")
async def uuid_handler(request, foo_id: UUID):
return text(f"UUID - {foo_id}")
对于一些标准类型,如 str
、int
和 UUID
,Sanic 可以从函数签名中推断出路径参数的类型。这意味着在路径参数定义中可能不总是需要包含类型。
@app.get("/foo/<foo_id>") # Notice there is no :uuid in the path parameter
async def uuid_handler(request, foo_id: UUID):
return text(f"UUID - {foo_id}")