返回响应后如何记录 POST 方法的返回值?

2024-04-19

我正在开发我的第一个 REST API,所以如果我错过了一些基本的东西,请提前道歉。我有一个函数,它从另一台服务器获取 JSON 请求,对其进行处理(根据数据进行预测),然后返回另一个带有结果的 JSON。我想在服务器的本地磁盘上保留对此端点的所有请求及其结果的日志,以用于评估目的和重新训练模型。但是,为了尽量减少返回结果给用户的延迟,我想先返回响应数据,然后再将其写入本地磁盘。对于我来说,如何正确执行此操作并不明显,因为 FastAPI 范例要求 POST 方法的结果是修饰函数的返回值,因此我想对数据执行的任何操作都必须完成before它被返回。

下面是一个最小的工作示例,我认为这是迄今为止我最接近的尝试,使用带有log装饰器 - 我的想法只是将结果作为类属性分配给日志对象,然后使用另一种方法将其写入磁盘,但我不知道如何确保调用该函数after get_data每次。

import json
import uvicorn
from fastapi import FastAPI, Request
from functools import wraps
from pydantic import BaseModel

class Blob(BaseModel):
    id: int
    x: float

def crunch_numbers(data: Blob) -> dict:
    # does some stuff
    return {'foo': 'bar'}

class PostResponseLogger:

    def __init__(self) -> None:
        self.post_result = None

    def log(self, func, *args, **kwargs):
        @wraps(func)
        def func_to_log(*args, **kwargs):
            post_result = func(*args, **kwargs)
            self.post_result = post_result

            # how can this be done outside of this function ???
            self.write_data()

            return post_result
        return func_to_log

    def write_data(self):
        if self.post_result:
            with open('output.json', 'w') as f:
                    json.dump(self.post_result, f)

def main():
    app = FastAPI()
    logger = PostResponseLogger()

    @app.post('/get_data/')
    @logger.log
    def get_data(input_json: dict, request: Request):
        result = crunch_numbers(input_json)
        return result

    uvicorn.run(app=app)

if __name__ == '__main__':
    main()

基本上,我的问题归结为:“有没有办法,在PostResponseLogger类,自动调用self.write_data每次致电后self.log?”,但如果我完全使用了错误的方法,也欢迎任何其他建议。


你可以有一个Background Task https://fastapi.tiangolo.com/tutorial/background-tasks/为了这个目的。后台任务“仅在发送响应后运行”(请参阅星光文档 https://www.starlette.io/background/)。 “这对于需要在请求之后发生的操作很有用,但客户端在收到响应之前实际上不必等待操作完成”(请参阅FastAPI文档 https://fastapi.tiangolo.com/tutorial/background-tasks/).

您可以定义一个任务函数在后台运行以写入日志数据,如下所示:

def write_log_data():
    logger.write_data()

然后,导入BackgroundTasks并在端点中定义一个参数,其类型声明为BackgroundTasks。在端点内部,传递您的任务函数(即write_log_data,如上所定义)到background_tasks对象与方法.add_task(), 如下所示。有关如何使用的更多详细信息BackgroundTasks可以找到这个答案 https://stackoverflow.com/a/76280152/17865804.

from fastapi import BackgroundTasks

@app.post('/get_data/')
def get_data(input_json: dict, request: Request, background_tasks: BackgroundTasks):
    result = crunch_numbers(input_json)
    background_tasks.add_task(write_log_data)
    return result

如果使用中间件来捕获和记录响应数据,则可以应用相同的原理,如中所述这个答案 https://stackoverflow.com/a/70899261/17865804,或自定义APIRoute类,如所示这个答案 https://stackoverflow.com/a/73464007/17865804.

供将来参考,如果您(或任何人)需要使用async/await语法,并遇到并发问题(例如event loop https://docs.python.org/3/library/asyncio-eventloop.html被阻止)在执行一些繁重的后台计算时,请看看这个答案 https://stackoverflow.com/a/71517830/17865804,这解释了定义端点或后台任务函数之间的区别async def and def(简要地,async def端点/后台任务将在event loop, 然而def函数将在外部线程池中运行,然后awaited),并提供了在此类函数中运行阻塞 I/O 密集型或 CPU 密集型操作时的解决方案。

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

返回响应后如何记录 POST 方法的返回值? 的相关文章

  • Codeigniter - 检查用户是否已登录并存在(它是真实用户)

    我正在尝试在用户登录我的网站时为他们设置会话数据 因此 如果用户存在于数据库中 我将设置一个会话数据 例如 this gt session gt set userdata user exists 1 现在 每次我想检查用户是否存在并已登录时
  • 如何使用 Serilog ForContext

    我是 Serilog 新手 很难弄清楚如何使用上下文功能 当我运行下面的代码时 输 出文件不包含报告 ID 我缺少什么想法吗 var logger new LoggerConfiguration WriteTo File C Log txt
  • 有没有办法使用 openpyxl 或 xlsxwriter 保护工作簿?

    我正在尝试自动化 Excel 报告 并且我希望用户不要尝试重命名或重新排序工作表 虽然我使用 xlsxwriter 保护单个单元格没有问题 但我没有看到保护工作簿本身的选项 我正在寻找 openpyxl 但教程似乎没有任何效果 编辑 我现在
  • 如何将同步函数包装在异步协程中?

    我在用着aiohttp https github com aio libs aiohttp构建一个 API 服务器 将 TCP 请求发送到单独的服务器 发送 TCP 请求的模块是同步的 对于我来说是一个黑匣子 所以我的问题是这些请求阻塞了整
  • 按序列大小对 fasta 进行排序

    我目前想按序列大小对 hudge fasta 文件 10 8 行和序列 进行排序 fasta 是生物学中用于存储序列 遗传或蛋白质 的明确定义的格式 gt id1 序列 1 可以位于多行 gt id2 序列2 我运行了一个提供 tsv 格式
  • 关闭应用程序后如何调试

    我正在尝试重现问题 这需要在特定位置关闭并重新打开我的应用程序 这是我的问题 1 如何查看我的日志 使用NSLog命令 当我的 iPhone 未连接到 XCode 时 2 是否可以将iPhone模拟器的特定位置 例如市中心 设置为默认位置
  • bool() 和operator.truth() 有什么区别?

    bool https docs python org 3 library functions html bool and operator truth https docs python org 3 library operator htm
  • 如何使用 keycloak 强制每个客户端登录(最佳实践?)

    我们目前正在实施 keycloak 但我们面临着一个问题 我们不确定解决它的最佳方法是什么 我们有不同的网络应用程序使用单点登录 并且运行良好 我们遇到的问题是 当我们在一个 Web 应用程序中使用 sso 登录 然后在另一个 Web 应用
  • 如何在Python中完美地将单元素列表转换为元组? [复制]

    这个问题在这里已经有答案了 所以我正在尝试这样做 tuple 1 我期望的输出是 1 但是 我得到了这个 1 但如果我这样做 tuple 1 2 它工作完美 像这样 1 2 这太奇怪了 我不知道为什么元组函数会导致这个结果 请帮我解决它 这
  • Python3 类型错误:replace() 参数 1 必须是 str,而不是 int

    我已经尝试了几天让这段代码在 MacOS 上运行 但没有成功 你能看一下我错过了什么吗 运行 python 3 6 我已经上传了整个代码 多谢 usr bin env python3 from future import print fun
  • Python子类方法从超类方法继承装饰器

    我有一个具有retrieve 方法的超类 并且它的子类每个都实现自己的retrieve 方法 我希望每个retrieve 方法都被装饰为在收到相同参数时缓存返回值 而不必在每个子类中装饰该方法 装饰器似乎不能被继承 我可能可以调用超类的方法
  • keras 中的增量学习

    我正在寻找 scikit learn 的 keras 等效项partial fit https scikit learn org 0 15 modules scaling strategies html incremental learni
  • XcodeColors 在 XCode 5 中不起作用

    我尝试安装XcodeColors在 XCode 5 中 但不幸的是 它不能与我从 XCode 4 6 获得的旧插件一起使用 下一步 我检查了 github 网站 在那里我看到了以下拉取请求 提供了 XCode 5 的工作版本 https g
  • 将 Python 3 与 AWS lambda 结合使用

    可以在 lambda 中使用使用 Python3 构建的应用程序 而不仅仅是 python2 7 可能会考虑周围的选择 https gun io blog announcing zappa serverless python aws lam
  • 设置 Pyenv 的路径

    我正在尝试在我的服务器中设置 Pyenv 的加载路径 bashrc file 我正在关注这个tutorial https realpython com intro to pyenv 它要求我们在哪里设置pyenv到加载路径 然而 在我的 b
  • 使用python shelve跨平台

    我希望得到关于 Python 中的书架 数据库的一些建议 问题 我在 Mac 上创建了一个数据库 我想在 Windows 7 上使用该数据库 我使用 Python 3 2 MacOS 10 7 和 win 7 当我在 Mac 上打开并保存我
  • 使用单个文件的 Python 日志记录(函数名、文件名、行号)

    我正在尝试了解应用程序的工作原理 为此 我将调试命令插入作为每个函数主体的第一行 目的是记录函数的名称以及向日志输出发送消息的行号 代码内 最后 由于这个应用程序由许多文件组成 我想创建一个日志文件 以便我可以更好地理解应用程序的控制流 这
  • 如何在 Python 中根据日期列绘制分类变量

    我有这样的数据 Date Fruit 2017 01 01 Orange 2017 01 01 Apple 2017 01 08 Orange 2017 01 09 Orange 2017 01 09 Apple 我想在一个图中按日期绘制橙
  • Django Web 应用程序中的 SMTP 问题

    我被要求向使用 Django Python 框架实现的现有程序添加一个功能 此功能将允许用户单击一个按钮 该按钮将显示一个小对话框 表单以输入值 我确实编写了一些代码 显示电子邮件已发送的消息 但实际上 它没有发送 My code from
  • python:函数中的变量,点前面是函数名

    我需要理解这个概念 其中我们可以在函数定义中的变量名中使用点 这里没有类定义 也没有模块 Python 不应该接受包含点的变量名 def f x f author sunder f language Python print x f aut

随机推荐

  • 如何在 R 中设置 highchart 全局选项

    我在 javascript 中看到了很多示例 但我找不到在 R 中执行此操作的示例 这是 API 链接 http api highcharts com highcharts global http api highcharts com hi
  • WIQL 查询获取项目中的所有团队和用户?

    let s say i have a project name Scrum and that has some users the project and got sprints so i want dstinct users of the
  • HttpConfiguration.get_ServiceResolver() 丢失

    我正在将 Ninject 与 MVC4 连接起来 并使其工作到尝试实际解决依赖关系的程度 但是 我收到以下异常 找不到方法 System Web Http Services DependencyResolver System Web Htt
  • Java 构造函数内部的多态性

    Code class A A test void test System out println from A class B extends A void test System out println from B class C pu
  • Google App Engine 的简单用户管理示例?

    我是 Google App Engine 的新手 当我学习本教程时 我发现我们在 php mysql 中所做的一些事情在 GAE 中不可用 例如 在 dataStore 中 自动增量功能不可用 我也对 GAE 中的会话管理感到困惑 总的来说
  • 在对象为布尔值的情况下,Javascript 中如何进行类型强制转换?

    尽我所知 x false 应该做同样的事情 x 因为他们都试图解释x作为布尔值 然后对其求反 然而 当我尝试对此进行测试时 我开始出现一些极其奇怪的行为 例如 false and false 两者都返回 true 此外 false unde
  • 内核虚拟地址转换

    考虑到 Linux 和 32 位 x86 架构 可访问的 4GB 地址空间的比例为 3 1 用户空间分配0 3 Gb 而3 4 Gb 分配给内核 大于 3Gb 且位于内核地址空间的虚拟地址如何转换为物理地址 页表会出现吗 梅尔 戈尔曼的书中
  • 如何列出泽西岛所有注册的 JAX-RS 实体提供商

    假设我有一个带有嵌入式码头的简单球衣应用程序github上的演示项目 https github com varren jersey2 gradle embedded jetty demo repo和下面的基本代码 回到 jersey1 的日
  • Android Studio 在运行测试时不使用 Gradle jvmArgs?

    我有一个带有 JUnit 测试的 Android 库 只有在使用 noverify标志传递给 JVM 我相信是因为this https stackoverflow com a 15122960 1910286 如果从命令行运行测试就会通过
  • 当我有表面声明时,如何为 sm_1X 和 sm_2X 编译 CUDA 程序

    我正在编写一个使用表面 重新采样并写入纹理 来提高性能的库 surface
  • 每行熊猫都会在下周日返回

    在 Pandas for Python 中 我有一个数据集 其中有一列日期时间 我需要创建一个新列 其中每行包含下周日的日期 我尝试过各种方法尝试使用 iterrows 然后计算出一周中的某一天 并添加一天直到该天为 7 但它没有起作用 我
  • GNUPLOT 绘制 5 天的财务周

    我已经寻找了一段时间 以找出如何从财务图中删除一周中的几天 但没有成功 我需要该图仅包含一周中的几天并完全忽略周末 以便财务图表中没有 2 天的差距 我有 CSV 格式的开盘 低 收盘 高数据 并且缺少周末数据 它绘制得很好 但我找不到如何
  • CoroutineScope.async 上的异常传播如何工作?

    我看到多个消息来源声称 async 块内发生的异常不会传递到任何地方 仅存储在Deferred实例 声称该异常仍然是 隐藏的 并且仅在人们调用时影响外部事物await 这通常被描述为之间的主要区别之一launch and async 这是一
  • 创建Flutter项目时出现权限错误

    我是 Flutter 新手 安装后 当我尝试创建项目时出现此错误 hello world flutter create ios language swift android language kotlin Failed to open or
  • 如何在 Javafx 中将文本插入到形状中?

    我使用 JavaFX 创建了一个简单的矩形对象 我希望能够将文本对象放入该矩形内 并使其自动在矩形内保持对齐 我必须绘制矩形的代码是 public static Scene createScene Group root new Group
  • 科尔多瓦应用程序中的输入类型=“文件”替代方案

    我正在开发一个科尔多瓦 Android 应用程序 但是input type file 在那里不起作用 我应该使用哪种替代方法才能在加载文件之前看到提示窗口 None
  • 如何在 C# 中保存电子邮件附件 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何使用 C 从我的邮件 例如 gm
  • React-router-redux 在链接上单击两次即可更新位置状态

    我的应用程序出现问题 无法在任何地方找到解决方案 我用react router redux and syncHistoryWithStore 当我单击导航以使用链接更改路线时 新路线会加载 浏览器中的 URL 会更新 但是location除
  • 有没有更好的方法将多值数据显示为列?

    我的笔记数据库中有 4 个审核字段 它们是多值的 当表单上的某些内容发生更改时 它们都会获得一个新条目 我有一个审核表单 以柱状方式显示这些字段 几乎就像一个视图 这是列的代码
  • 返回响应后如何记录 POST 方法的返回值?

    我正在开发我的第一个 REST API 所以如果我错过了一些基本的东西 请提前道歉 我有一个函数 它从另一台服务器获取 JSON 请求 对其进行处理 根据数据进行预测 然后返回另一个带有结果的 JSON 我想在服务器的本地磁盘上保留对此端点