在中间件上下文中获取 starlette 请求正文

2023-11-24

我有这样的中间件

class RequestContext(BaseHTTPMiddleware):
    async def dispatch(self, request: Request, call_next: RequestResponseEndpoint):
        request_id = request_ctx.set(str(uuid4()))  # generate uuid to request
        body = await request.body()
        if body:
            logger.info(...)  # log request with body
        else:
            logger.info(...)  # log request without body
 
        response = await call_next(request)
        response.headers['X-Request-ID'] = request_ctx.get()
        logger.info("%s" % (response.status_code))
        request_ctx.reset(request_id)

        return response

所以这条线body = await request.body()冻结所有有正文的请求,我收到了所有请求的 504 请求。在这种情况下如何安全地读取请求正文?我只想记录请求参数。


我不会创建一个继承自 BaseHTTPMiddleware 的中间件,因为它有一些issuesFastAPI 为您提供了创建自己的路由器的机会,根据我的经验,这种方法要好得多。

from fastapi import APIRouter, FastAPI, Request, Response, Body
from fastapi.routing import APIRoute

from typing import Callable, List
from uuid import uuid4


class ContextIncludedRoute(APIRoute):
    def get_route_handler(self) -> Callable:
        original_route_handler = super().get_route_handler()

        async def custom_route_handler(request: Request) -> Response:
            request_id = str(uuid4())
            response: Response = await original_route_handler(request)

            if await request.body():
                print(await request.body())

            response.headers["Request-ID"] = request_id
            return response

        return custom_route_handler


app = FastAPI()
router = APIRouter(route_class=ContextIncludedRoute)


@router.post("/context")
async def non_default_router(bod: List[str] = Body(...)):
    return bod


app.include_router(router)

按预期工作。

b'["string"]'
INFO:     127.0.0.1:49784 - "POST /context HTTP/1.1" 200 OK
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在中间件上下文中获取 starlette 请求正文 的相关文章

  • 有什么好的适用于 Google App Engine 应用程序的 AJAX 框架吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试在我的 Google App Engine 应用程序中实现 AJAX 因此我正在寻找一个好的
  • 使用ideone时如何传入命令行参数?

    我正在使用 ideone 在线解释器 http ideone com http ideone com 来测试一些 C 和 Python 程序 如何指定命令行参数而不是使用 STDIN 输入 看起来你不能 但是快速破解应该做的伎俩 stati
  • 在 Python 中延迟转置列表

    所以 我有一个延迟生成的可迭代的三元组 我试图弄清楚如何将其转换为 3 个可迭代对象 分别由元组的第一个 第二个和第三个元素组成 然而 我希望这件事能懒惰地完成 所以 举例来说 我希望 1 2 3 4 5 6 7 8 9 将变成 1 4 7
  • 在Python中将大文件(25k条目)加载到dict中很慢?

    我有一个大约有 25000 行的文件 它是 s19 格式的文件 每行就像 S214780010 00802000000010000000000A508CC78C 像这样的事情怎么样 我做了一个测试文件 只有一行S21478001000802
  • 在 python 中发送标头[重复]

    这个问题在这里已经有答案了 我有以下 python 脚本 我想发送 假 标头信息 以便我的应用程序就像 Firefox 一样运行 我怎么能这么做呢 import urllib urllib2 cookielib username passw
  • DataFrame.loc 的“索引器太多”

    我读了关于切片器的文档 http pandas pydata org pandas docs stable advanced html using slicers一百万次 但我从来没有理解过它 所以我仍在试图弄清楚如何使用loc切片Data
  • 在多核上运行 python 线程

    我知道Python 2 7不允许在不同的内核上运行多个线程 你需要使用multiprocessing模块以实现某种程度的并发性 我正在看concurrent futuresPython 3 4 中的模块 是否使用ThreadPoolExec
  • 无法使用Python请求会话模块登录网站

    我刚刚开始进行网络抓取 对于我的第一个项目 我尝试使用 requests Session 登录 artofproblemsolving com 并访问另一个用户的帐户 这是我的代码 import requests LOGIN URL htt
  • 对法语文本进行词形还原[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一些法语文本需要以某种方式进行处理 为此 我需要 首先 将文本标记为单词 然后对这些单词进行词形还原以避免多次处理相同的词根 据我
  • 如何在Python中手动对数字列表进行排序?

    规格 Ubuntu 13 04 Python 3 3 1 背景 Python的初学者 遇到了这个 手动排序 问题 我被要求做的事情 让用户输入 3 个数值并将它们存储在 3 个不同的变量中 不使用列表或排序算法 手动将这 3 个数字从小到大
  • ImproperlyConfigured at / 不允许空静态前缀 - Django

    我正在使用 Django 上传 显示图像 该网站部署在 Heroku 上 下列的this https coderwall com p bz0sng教程我能够成功上传图像 但是 图像并未显示在模板中 然后我了解到我的 urls py 末尾应该
  • Pandas 中每列的曲线拟合 + 外推值

    我有一个包含大约 300 列的数据集 每一列都与深度相关 Pandas DataFrame 的简化版本看起来像这样 import matplotlib pyplot as plt import numpy as np import pand
  • 类变量:“类列表”与“类布尔值”[重复]

    这个问题在这里已经有答案了 我不明白以下示例的区别 一次类的实例可以更改另一个实例的类变量 而另一次则不能 示例1 class MyClass object mylist def add self self mylist append 1
  • Pygame:有人可以帮我实现双跳吗?

    我知道已经有其他关于此问题的帖子了 但我的运动系统与我发现的有点不同 所以随后我问这个问题 我的运动系统基于一个名为的命名元组Move up left right down 然后就是这个 def update self move block
  • Django 1.7:如何使用 html/css 文件作为模板发送电子邮件

    从 Django 1 7 开始 可以send email 使用新参数 html message 不幸的是 没有关于如何使用它的全面指南 新手友好 或者至少我找不到它 我需要使发送的电子邮件变得漂亮 因此 我试图弄清楚如何将我的消息包含到 h
  • 在字符串内打印单引号

    我想输出 XYZ s ABC 我在Python IDLE中尝试了以下3条语句 第一条和第二条语句输出 a before 带打印功能的第三条语句不输出 before 作为 Python 新手 我想了解为什么 之前输出 在第 1 条和第 2 条
  • 解析整数集的字符串并列出间隔

    I have 2 5 7 9 12 string 我想从中获取 2 5 7 8 9 12 列表 python中有没有内置的函数 Thanks UPD 我想 直接的答案是No 不管怎样 谢谢你的 片段 使用一个 建议者斯文 马尔纳克 s 2
  • 在 4K 屏幕上使用 Matplotlib 和 TKAgg 或 Qt5Agg 后端

    我在 Ubuntu 16 04 上使用 Matplotlib 2 0 和 Python 3 6 来创建数据图 电脑显示器的分辨率为 4k 分辨率为 3840x2160 绘图数字看起来非常小 字体也很小 我已经尝试过TKAgg and Qt5
  • 将二进制数据视为文件对象?

    在此代码片段 由另一个人编写 中 self archive是一个大文件的路径并且raw file是以二进制数据形式读取的文件内容 with open self archive rb as f f seek offset raw file s
  • 如何使用 python 模块的多个 git 分支?

    我想使用 git 来同时处理我正在编写的模块中的多个功能 我目前正在使用 SVN 只有一个工作区 因此我的 PYTHONPATH 上只有该工作区 我意识到这不太理想 所以我想知道是否有人可以建议一种更 正确 的方法来做到这一点 让我用一个假

随机推荐

  • Google 日历 API、RRULE 和 EXDATE

    我正在尝试使用 API 将一些事件导出到 Google Calendar 特别是包装它的 python 库 这些事件会重复发生 这是使用 RRULE 字符串定义到 Google 日历的 并且我尝试使用 EXDATE 字符串排除某些日期 这是
  • POST 内容长度超出限制

    当用户上传文件时 我在 php 的 error log 中收到类似的错误 PHP 警告 POST 内容长度 11933650 字节超出了第 0 行未知中 8388608 字节的限制 在我的 php ini 在 public html 中创建
  • 如何用C#创建CSV Excel文件? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我正在寻找用于创建 CSV Excel 文件的课程 预期功能 使用极其简单 转义逗号和引号 以便 excel 可以很好地处理它们 以时区证明格式导出日期和日期时间 你知道有什么类可以做
  • 在构建后事件期间确定程序集版本

    假设我想创建一个随每个版本一起提供的静态文本文件 我希望使用发行版的版本号更新该文件 如中指定的 AssemblyInfo cs 但我不想手动执行此操作 我希望我可以使用构建后事件并将版本号提供给批处理文件 如下所示 call foo ba
  • 如何将角度日期转换为另一个时区

    我在用Date 获取本地时区的当前时间 我已将其格式化如下 this today new Date from new DatePipe en Us transform this today dd MM yyyy hh mm ss 现在我想转
  • 添加自定义 LinearLayout 时 Android 布局预览器抛出错误

    我定义了一个自定义 ViewGroup 来扩展 LinearLayout 的功能 public class TestLayout extends LinearLayout public TestLayout Context context
  • iOS 10 中的 sqlite3_prepare_v2 exc_bad_access

    我在我的 iOS 项目中使用 sqlite 作为数据库 在 iOS 9 中 一切都运行良好 现在我已经更新了新的 Xcode 但应用程序在 sqlite3 prepare v2 处多次崩溃 另外 我不会超时关闭数据库 并且只打开一次 我在下
  • 如何在正则表达式中使用变量?

    我想创建一个String replaceAll JavaScript 中的方法 我认为使用正则表达式是最简洁的方法 但是 我不知道如何将变量传递给正则表达式 我已经可以做到这一点 这将替换所有实例 B with A ABABAB repla
  • 通过索引查询LIKE%MYSQL搜索速度慢

    我的表有 100 000 000 行 非常大 表的结构 id int INDEX not primary not unique just index lang index varchar 5 INDEX name varchar 255 I
  • 如何在 Cocos2D 3.x 中为 CCSprite 制作动画?

    你知道如何制作动画吗CCSprite在新的Cocos2D v3 x 很多类都改变了 旧的方法似乎不起作用 NSMutableArray animFrames NSMutableArray array for int i 1 i lt 3 i
  • mmap 比 getline 慢?

    我面临着逐行读取 写入文件 在演出中 的挑战 阅读许多论坛条目和站点 包括一堆 SO mmap 被建议作为读取 写入文件的最快选项 但是 当我使用 readline 和 mmap 技术实现代码时 mmap 是两者中较慢的一个 对于阅读和写作
  • 在 Parse (Android) 中保存和检索照片和视频

    我正在看解析Android文档并发现要保存照片和视频 您必须初始化new ParseFile带有名称和数据的 byte 并保存它 将图像 Uri 和视频 Uri 转换为字节数组的最简单方法是什么 以下是我尝试的解决方案 mPhoto new
  • 如何在 Django 中执行 JSON 处理程序

    我想在 django 视图中获取并解析 json 模板中的请求 var values input name param each function values this attr name this val ajax type POST
  • 从版本控制 mysql schemata 开始,没有过度杀伤力。好的解决方案吗?

    我已经意识到我必须开始对数据库模式和更改进行版本控制 因此 我阅读了有关该主题的现有帖子 但我不确定如何继续 我基本上是一家单人公司 不久前我什至没有对我的代码使用版本控制 我在 Windows 环境中 使用 Aptana IDE 和 SV
  • Python 将单个语句包装在 try except 块中的简洁方法

    我目前正在使用 com Excel 进行一些 Python 自动化 它功能齐全 并且可以满足我的要求 但我发现了一些令人惊讶的事情 有时 我使用的某些 Excel 命令会无缘无故地失败并出现异常 其他时候 它们会起作用 在我正在做的 VB
  • ElasticSearch 在单词内使用连字符进行搜索

    我想寻求帮助 我想在标题和内容中搜索单词 这是结构 body gt array mappings gt array myindex gt array source gt array enabled gt true properties gt
  • “列表理解”和类似的意思是什么?它是如何工作的以及我该如何使用它?

    我有以下代码 x 2 for x in range 10 当我在 Python shell 中运行它时 它返回 0 1 4 9 16 25 36 49 64 81 我搜索过 似乎这被称为列表理解类似地 似乎还有 set dict 理解和生成
  • 如何在 Payara 5 中使用 Jackson 2?

    我正在使用 Jackson 2 和 Payara 4 我想使用杰克逊 2 位于 Payara 5 使用 JAX RS 我还想避免更改注释等等 在 Payara 5 中 默认的 Jsonb 提供者是 Yasson 有什么想法可以禁用它并使用杰
  • Jmeter命令行在聚合报告中“保存表数据”

    我想使用命令行保存聚合报告生成的表数据 以便我可以自动化该过程 然而 我从 2004 年左右使用 2 2 2 3 jmeter 的旧帖子中读到这是无法完成的 但由于现在是 2014 年 我们使用的是 jmeter 2 11 我想知道我们是否
  • 在中间件上下文中获取 starlette 请求正文

    我有这样的中间件 class RequestContext BaseHTTPMiddleware async def dispatch self request Request call next RequestResponseEndpoi