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')
    
  • PATCH:

    @app.patch('/test')
    async def handler(request):
        return text('OK')
    
  • DELETE:

    @app.delete('/test')
    async def handler(request):
        return text('OK')
    
  • HEAD:

    @app.head('/test')
    async def handler(request):
        return text('OK')
    
  • OPTIONS:

    @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}")

对于一些标准类型,如 strintUUID,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}")