使用 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 中所述,它允许您将请求正文分别解析为 JSON
或 form-data
。
我正在构建一个 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 中所述,它允许您将请求正文分别解析为 JSON
或 form-data
。