使用 fastapi 解析 slack post 请求

Use fastapi to parse slack post request

我正在构建一个 fastapi 服务器来接收由 slack slash 命令发送的请求。使用下面的代码,我可以看到打印了 token=BLAHBLAH&team_id=BLAHBLAH&team_domain=myteam&channel_id=BLAHBLAH&channel_name=testme&user_id=BLAH&user_name=myname&command=%2Fwhatever&text=test&api_app_id=BLAHBLAH&is_enterprise_install=false&response_url=https%3A%2F%2Fhooks.slack.com%2Fcommands%BLAHBLAH&trigger_id=BLAHBLAHBLAH,这正是我在官方文档(https://api.slack.com/interactivity/slash-commands#app_command_handling)中看到的有效载荷。我正在尝试使用有效载荷信息来做某事,我很好奇是否有解析此有效载荷信息的好方法。我绝对可以使用 split 函数或任何其他漂亮的函数来解析此有效负载,但我很好奇是否有 'de facto' 处理松弛有效负载的方法。提前致谢!

from fastapi import FastAPI, Request

app = FastAPI()


@app.post("/")
async def root(request: Request):
    request_body = await request.body()
    print(request_body)

您通常会使用 Pydantic models to declare a request body - if you were about to receive data in JSON form - thus benefiting from the validation that Pydantic 必须要约。所以,你会定义一个这样的模型:

from pydantic import BaseModel

class Item(BaseModel):
    token: str
    team_id: str
    team_domain: str
    # etc.

@app.post("/")
def root(item: Item):
    print(item.dict())  # convert to dictionary (if required)
    return item

有效负载如下所示:

{
    "token": "gIkuvaNzQIHg97ATvDxqgjtO"
    "team_id": "Foo",
    "team_domain": "bar",
    # etc.
}

但是,如果您即将接收 Form data, just like what slack API does (as shown in the link you provided), you could use Form 文件中的负载。使用 Form 字段,您的有效负载仍将根据这些字段和您定义它们的类型进行验证。但是,您需要定义端点中的所有参数,如上文所述 link 和如下所示:

from fastapi import  Form

@app.post("/")
def root(token: str = Form(...), team_id: str = Form(...), team_domain: str = Form(...)):
    return {"token": token, "team_id": team_id, "team_domain": team_domain}

或者为了避免这种情况,您可能想看看 ,它描述了如何使用具有 Form 个字段的 Pydantic 模型。

由于 FastAPI 实际上是底层的 Starlette,即使您仍然必须按照问题中显示的方式访问请求主体,您也应该使用 request.json()request.form() 等方法,如 Starlette documentation 中所述,它允许您将请求正文分别解析为 JSONform-data