使用 FastAPI 解析来自 Slack 的传入 POST 请求

2023-12-02

我正在构建一个 FastAPI 服务器来接收 slacklash 命令发送的请求。使用下面的代码,我可以看到以下内容:

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

被打印出来,这正是我在官方文档。我正在尝试使用有效负载信息来做某事,我很好奇是否有一种解析此有效负载信息的好方法。我绝对可以使用 split 函数或任何其他漂亮的函数来解析这个有效负载,但我很好奇是否有一种“事实上的”方法来处理松弛有效负载。提前致谢!

from fastapi import FastAPI, Request

app = FastAPI()

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

Receive JSON data

你通常会使用用于声明请求主体的 Pydantic 模型- 如果您要接收数据JSON形式 - 因此受益于验证Pydantic必须提供(有关如何发布的更多选项JSON数据,看一下这个答案)。因此,您可以定义这样的模型:

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.
}

Receive Form data

但是,如果您即将收到有效负载Form data,就像 slack API 所做的那样(如link你提供的),你可以使用Form字段。和Form字段,您的有效负载仍将根据这些字段以及您定义它们的类型进行验证。但是,您需要定义端点中的所有参数,如上面的链接所述,如下所示:

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字段,您可以创建一个自定义依赖类(使用@dataclass装饰器,为了简单起见),这将允许您定义多个Form单独类中的字段,并且仅在端点中使用该类定义 - 请参阅这个答案 and 这个答案有关 FastAPI 依赖项的更多详细信息。例子:

from dataclasses import dataclass
from fastapi import FastAPI, Form, Depends

@dataclass
class Item:
    token: str = Form(...)
    team_id: str = Form(...)
    team_domain: str = Form(...)
    #...

@app.post("/")
def root(data: Item = Depends()):
    return data

由于 FastAPI 实际上是 Starlette,即使您仍然必须按照问题中的方式访问请求正文,您也应该使用以下方法request.json() or request.form(),如中所述星光文档,这将允许您将请求正文解析为JSON or form-data, 分别。请看一下这个答案了解更多详细信息和示例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 FastAPI 解析来自 Slack 的传入 POST 请求 的相关文章

  • Django:模拟模型上的字段

    如何将模拟对象分配给该模型上的用户字段 无论如何都要绕过 SomeModel user 必须是 User 实例 检查吗 class SomeModel models Model user models ForeignKey User 我不会
  • Python setuptools:如何在 setup.py 中添加私有存储库 (gitlab)?

    我上传了 2 个包 它们位于我的 gitlab 存储库中 如果我想使用 pip 将它们安装在我的系统中 这很容易 因为 gitlab 可以帮助您 https docs gitlab com ee user packages pypi rep
  • 如何将base64字符串直接解码为二进制音频格式

    音频文件通过 API 发送给我们 该文件是 Base64 编码的 PCM 格式 我需要将其转换为 PCM 然后再转换为 WAV 进行处理 我能够使用以下代码解码 gt 保存到 pcm gt 从 pcm 读取 gt 保存为 wav decod
  • Flask+Nginx+uWSGI:导入错误:没有名为站点的模块

    我安装为http www reinbach com uwsgi nginx flask virtualenv mac os x html http www reinbach com uwsgi nginx flask virtualenv
  • 如何使用 pyinstaller 包含文件?

    我也使用 tkinter 使用 python 3 7 编写了一个程序 由于我使用的是外部图片 因此当我将所有内容编译为一个 exe 时 我需要包含它们 我试过做 add data bg png files 但我仍然收到此错误 tkinter
  • 从Python中的字符串中提取货币金额

    我正在制作一个程序 从字符串中获取货币并将其转换为其他货币 例如 如果字符串是 the car cost me 13 250 我需要得到 and 13250 我已经有了这个正则表达式 1 确实如此 但是该字符串很有可能有多个价格 并且全部使
  • for 循环如何评估其参数

    我的问题很简单 Does a for循环评估它每次使用的参数 Such as for i in range 300 python 是否会为此循环的每次迭代创建一个包含 300 个项目的列表 如果是的话 这是避免这种情况的方法吗 lst ra
  • 如何使用显式引用转储 YAML?

    递归引用非常适合ruamel yaml or pyyaml ruamel yaml dump ruamel yaml load A A id001 id001 然而 它 显然 不适用于普通引用 ruamel yaml dump ruamel
  • 根据开始列和结束列扩展数据框(速度)

    我有一个pandas DataFrame含有start and end列 加上几个附加列 我想将此数据框扩展为一个时间序列 从start值并结束于end值 但复制我的其他专栏 到目前为止 我想出了以下内容 import pandas as
  • 登录网站并使用 python 请求下载文件

    我有一个带有 HTML 表单的网站 登录后 它会将我带到 start php 站点 然后将我重定向到overview php 我想从该服务器下载文件 当我单击 ZIP 文件的下载链接时 链接后面的地址是 getimage php path
  • 如何将 self 传递给装饰器?

    我该如何通过self key下面进入装饰器 class CacheMix object def init self args kwargs super CacheMix self init args kwargs key func Cons
  • python 中的 Johansen 协整检验

    我找不到任何有关在处理统计和时间序列分析 pandas 和 statsmodel 的 Python 模块中执行 Johansen 协整检验的功能的参考 有谁知道是否有一些代码可以执行时间序列之间的协整测试 现在 这已在 Python 的 s
  • Apache Spark 中的高效字符串匹配

    我使用 OCR 工具从屏幕截图中提取文本 每个大约 1 5 句话 然而 当手动验证提取的文本时 我注意到时不时会出现一些错误 鉴于文本 你好 我真的很喜欢 Spark 我注意到 1 像 I 和 l 这样的字母被 替换 2 表情符号未被正确提
  • 乘以行并按单元格值附加到数据框

    考虑以下数据框 df pd DataFrame X a b c d Y a b d e Z a b c d 1 2 1 3 df 我想在 列中附加数字大于 1 的行 并在该行中的数字减 1 df 最好应该 然后看起来像这样 或者它可能看起来
  • 如何使用 paramiko 查看(日志)文件传输进度?

    我正在使用 Paramiko 的 SFTPClient 在主机之间传输文件 我希望我的脚本打印文件传输进度 类似于使用 scp 看到的输出 scp my file user host user host password my file 1
  • 在 Sphinx 中,有没有办法在声明参数的同时记录参数?

    我更喜欢在声明参数的同一行记录每个参数 根据需要 以便应用D R Y http en wikipedia org wiki Don t repeat yourself 如果我有这样的代码 def foo flab nickers a ser
  • 对数据帧的每 2 小时数据进行 Groupby

    我有一个数据框 Time T201FN1ST2010 T201FN1VT2010 1791 2017 12 26 00 00 00 854 69 0 87 1792 2017 12 26 00 20 00 855 76 0 87 1793
  • 如何使用 matplotlib 为圆柱体的每个单独面添加颜色

    我正在尝试为圆柱体的每个面着色 但是我不确定如何进行 我尝试了以下方法 for i in range 10 col append for i in range 10 for j in range 20 col i append plt cm
  • 在 virtualenvwrapper 中激活环境

    我安装了virtualenv and virtualenvwrapper用这个命令我创建了一个环境 mkvirtualenv cv 它有效 创建后我就处于新环境中 现在我重新启动了我的电脑 我想activate又是那个环境 但是怎么样 我使
  • 如何为所有用户安装 Anaconda python?

    Anaconda python 发行版 https store continuum io cshop anaconda 非常方便地部署科学计算环境 SCE 并根据需要切换python版本 默认情况下 安装会将 python 定位到 anac

随机推荐

  • 在网络浏览器上使用 .otf 字体

    我正在做一个需要在线试用字体的网站 我拥有的字体都是 otf 有没有办法嵌入字体并让它们在所有浏览器上运行 如果没有 我还有什么其他选择 您可以实施您的OTF使用 font face 的字体 例如 font face font family
  • 将数据网格绑定到数据读取器

    我希望能够在文本框中输入 SQL 并在 WPF 数据网格中显示结果 我想从一个开始SqlDataReader 并设置数据网格的ItemsSource至数据读取器 using var cmd conn CreateCommand cmd Co
  • type(list[0]) 返回 pynput.keyboard._win32.KeyCode

    我的问题是如何pynput返回数据 我希望你会这么说 所以我想做的是让监听器记录键盘输入 然后使用添加到列表中的字母来生成单词中的字符串 不过 这些字母似乎不是字符串 相反 它们返回为pynput keyboard win32 KeyCod
  • 在 Python 中使用 mysql.connector 处理格式参数失败

    我不明白这个插入语句我做错了什么 我收到的错误是 Failed processing format parameters s err mysql connector errors ProgrammingError Failed proces
  • Inno Setup [Code] 部分变量到 [Registry]

    我的 Inno 安装程序有问题 我正在使用分辨率检测脚本 Code 此处的部分 INNO设置 如何获取主显示器的分辨率 现在我想把xres and yres价值观 Registry 我的安装程序的部分如下所示 Root HKCU Subke
  • C# NPOI 将单元格样式设置为文本/字符串 1-19 格式化为日期/禁用任何格式

    我正在创建一个Excel 当我编写一些值示例1 19时 当我打开Excel文档时 我看到1 19 但是如果我单击它 那么Excel会尝试将其格式化为日期 有没有办法强制工作表不使用任何公式或格式 我查了一下 数据格式是字符串 private
  • Android:即使我在 DatePicker 之外触摸,DatePicker 也会设置值

    我有一个 TextView 当我触摸 TextView 时 它会调用 Date 和 TimePicker 首先 我显示 DatePicker 一旦选择了日期 我就可以设置该值 设置值后 我将从 TimePicker 获取时间 就像 Date
  • 如何在 Stripe (Rails) 中创建费用和客户

    我正在构建一个基于订阅的应用程序 我想通过 Stripe 订阅向客户收费 我正在尝试在提交表单后创建客户和费用 然而 只创建了代币 而不创建费用和客户 因此 表单成功通过 但在 Stripe 仪表板中 测试费用和客户不存在 这是我的控制器
  • 如何在 iOS8 中使用 IOKit 获取设备的序列号作为 IOPlatformSerialNumber 给出 nil 值

    我想知道如何使用获取设备的序列号IOKit在iOS8中 我用了UIDevice serialNumber我可以在 iOS 6 和 7 中获取序列号 在 iOS 8 中 值为platformSerialNumber来了nil在下面一行中 CF
  • CakePHP HTML Helper:链接中的图像被转义?

    从 Cake 1 2 更新到 1 3 我在链接元素中嵌套了一个图像 两者都是由 HTML 帮助程序生成的 然而 嵌套图像的标记被转义了 lt to gt 等等 我知道 HTML 助手现在默认会转义一些东西 但我无法让它改变这种行为 这是生成
  • 当我清除应用程序数据后,它不再起作用

    我正在使用 xamarin 表单制作一个应用程序 我在我的手机上测试了它 然后 apk 就在那里 但是当我清除android上的数据时 我的应用程序不再打开 有人看到了吗 问题是什么 是的 这很正常Xamarin Android在调试模式下
  • SQL Server 架构审计?

    我们有一个 SQL Server 2008 Enterprise 数据库 它有两种不同的模式 一种是我们维护的锁定模式 另一种是我们允许外部开发团队根据自己的需要添加和修改的开放模式 通常这对我们来说效果很好 但一个特定的团队喜欢把事情搞砸
  • Android getResources/getIdentifier 不返回 ID

    我有这样的代码 String s replace menu data imageid png int RID this getApplicationContext getResources getIdentifier s drawable
  • 获取数据帧中每行中的前 n 个值及其出现的列名称

    我有一个像这样的数据框 df pd DataFrame a 1 2 1 b 4 6 0 c 0 4 8 a b c 1 4 0 2 6 4 1 0 8 对于每一行 我需要 both n 在本例中为两个 最高值和相应的列 按降序排列 row
  • C# 相当于 C 中的 DllMain (WinAPI)

    我有一个较旧的应用程序 大约 2005 年 它接受 dll 插件 该应用程序最初是为 Win32 C 插件设计的 但我有一个可用的 C dll 模板 我的问题 我需要进行一些一次性初始化 这在 Win32 C dll 中将在 DllMain
  • 计算午夜后两次之间的持续时间

    如何计算两次之间的持续时间 var start moment 17 00 HH mm var end moment 02 15 HH mm moment duration end diff start asHours outputs 14
  • 使用 Python 中的 Requests 库发送“用户代理”

    我想发送一个值 User agent 使用 Python Requests 请求网页时 我不确定是否可以将其作为标头的一部分发送 如下面的代码所示 debug verbose sys stderr user agent User agent
  • Xcode 中的 Git 提交模板

    我已经添加到全局 git 配置中 git config global commit template gitmessage 创建了 gitmessage file one line summary of changes Because re
  • Cocoa:限制鼠标在屏幕上

    我正在为 OSX 开发一个信息亭模式应用程序 在某些情况下 会连接另一个屏幕 我的应用程序在一个屏幕上全屏运行 使用 self window contentView enterFullScreenMode s withOptions NSD
  • 使用 FastAPI 解析来自 Slack 的传入 POST 请求

    我正在构建一个 FastAPI 服务器来接收 slacklash 命令发送的请求 使用下面的代码 我可以看到以下内容 token BLAHBLAH team id BLAHBLAH team domain myteam channel id