当前位置: 首页 > news >正文

python使用httpx_sse调用sse流式接口对响应格式为application/json的错误信息的处理

目录

  • 问题描述
  • 方案

问题描述

调用sse流式接口使用httpx_sse的方式

				import httpxfrom httpx_sse import connect_sse# 省略无关代码try:with httpx.Client() as client:with connect_sse(client, "GET", url, params=param) as event_source:clear_textbox(response_textbox)# 把 iter_sse() 迭代完, 就相当于处理完了一次流式调用for sse in event_source.iter_sse():# 流式响应中,每次响应体的处理逻辑print(f"generated_answer的值是: '{sse.data}'")response = sse.dataif response != '':# self.response = responseappend_text(response_textbox, response)except httpx.RequestError as e:print(f"请求错误:{e}")except Exception as e:print(f"发生了一个错误:{e}")

httpx_sse的connet_sse源码:

@contextmanager
def connect_sse(client: httpx.Client, method: str, url: str, **kwargs: Any
) -> Iterator[EventSource]:headers = kwargs.pop("headers", {})headers["Accept"] = "text/event-stream"headers["Cache-Control"] = "no-store"with client.stream(method, url, headers=headers, **kwargs) as response:yield EventSource(response)

可以看到connect_sse源码中的headers的"Accept"设置了只接受"text/event-stream"流式结果,正常这么调用是没错的。但是当后端的流式接口因为401权限问题等报错返回了"application/json"格式,如
{ “code”:401, “msg”:“登录过期,请重新登录”, “data”:null} 这样的json格式结果时,以上代码就会报错,因为他不是"text/event-stream"流式响应结果头。那么该怎么办呢?

方案

重新写一个自定义的connect_sse。

import httpx
from httpx_sse import EventSource
from typing import Any, Iterator
from contextlib import contextmanager
import json
# 自定义调用sse接口@contextmanagerdef custom_connect_sse(self, client: httpx.Client, method: str, url: str, **kwargs: Any) -> Iterator[EventSource]:headers = kwargs.pop("headers", {})# 只有当没有指定Accept时才添加默认值headers["Accept"] = "*/*"headers["Cache-Control"] = "no-store"with client.stream(method, url, headers=headers, **kwargs) as response:content_type = response.headers.get('content-type', '').lower()json_flag = Falseif 'text/event-stream' in content_type:# 处理SSE流yield json_flag, EventSource(response)elif 'application/json' in content_type:# yield response  # 在这里你可以决定如何进一步处理这个JSON响应# 读取并合并所有文本块text_data = ''.join([chunk for chunk in response.iter_text()])# 解析整个响应体为JSONjson_data = json.loads(text_data)json_flag = Trueyield json_flag, json_data

调用代码

# 使用自定义的connect_sse函数try:with httpx.Client() as client:with self.custom_connect_sse(client, "GET", url, params=param, headers=headers) as (json_flag, event_source):if json_flag:code = event_source.get("code")msg = event_source.get("msg")print(f"Code: {code}, Message: {msg}")else:full_answer = ""clear_textbox(response_textbox)for sse in event_source.iter_sse():print(f"generated_answer的值是: '{sse.data}'")response = sse.dataif response:append_text(response_textbox, response)full_answer += responseuser_record += reply + full_answer + "\n"print(f"user_record:{user_record}")except httpx.RequestError as e:print(f"请求错误:{e}")except Exception as e:print(f"发生了一个错误:{e}")

关键步骤:
1.设置headers[“Accept”] = “/”,所有响应头都可以接收
2.content_type = response.headers.get(‘content-type’, ‘’).lower() 判断响应头是流式还是json,并用json_flag记录是否json标识,返回不同的结果。如果是json,则循环合并处理chunk块,拼装完整json返回结果(实测第一次就返回完整json结构了,但是代码得这么写)。
3.使用自定义connect_sse方法时,根据json_flag来分别处理成功调用流式结果还是异常的json结果。

相关文章:

python使用httpx_sse调用sse流式接口对响应格式为application/json的错误信息的处理

目录 问题描述方案 问题描述 调用sse流式接口使用httpx_sse的方式 import httpxfrom httpx_sse import connect_sse# 省略无关代码try:with httpx.Client() as client:with connect_sse(client, "GET", url, paramsparam) as event_source:clear_textbox(response_t…...

Leetcode-407. Trapping Rain Water II [C++][Java]

目录 一、题目描述 二、解题思路 【C】 【Java】 Leetcode-407. Trapping Rain Water IIhttps://leetcode.com/problems/trapping-rain-water-ii/description/ 一、题目描述 Given an m x n integer matrix heightMap representing the height of each unit cell in a 2D…...

详解 torch.triu:上三角矩阵的高效构造(中英双语)

详解 torch.triu:上三角矩阵的高效构造 在深度学习和矩阵运算中,我们经常需要构造上三角矩阵(Upper Triangular Matrix),其中主对角线以下的元素全部设为 0。PyTorch 提供了一个高效的函数 torch.triu(),用…...

[ TypeScript ] “undefined extends xxx“ 总是为 true 的 bug

版本号 "typescript": "^5.7.3", "unplugin": "^2.2.0",说明 在使用 unplugin 时 , 我定义插件的参数是 必填的, 使用时却是一个可空参数, 不传参也不会报错, (options?: UserOptions) > Return 😲😲&…...

高清下载油管视频到本地

下载工具并安装: yt-dlp官网地址: GitHub - yt-dlp/yt-dlp: A feature-rich command-line audio/video downloader ffmpeg官网地址: Download FFmpeg 注:记住为其添加环境变量 操作命令: 该指令表示以720p码率下载VIDEO_UR…...

Hadoop常用操作命令

在NameNode节点格式化集群 初始化集群 hdfs namenode -format启动HDFS sbin/start-dfs.sh启动yarn sbin/start-yarn.sh启动NodeManager yarn-daemon.sh start nodemanager启动DataNode hadoop-daemon.sh start datanode启动SecondaryNameNode hadoop-daemon.sh start se…...

[HOT 100] 2439. 最小化数组中的最大值

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 2439. 最小化数组中的最大值 - 力扣(LeetCode) 2. 题目描述 给你一个下标从 0 开始的数组 nums ,它含有 n 个非负整数。 每一步操作中&#…...

【JavaEE进阶】图书管理系统 - 贰

目录 🌲前言 🎄设计数据库 🍃引⼊MyBatis和MySQL驱动依赖 🌳Model创建 🎍约定前后端交互接口 🍀服务器代码 🚩控制层 🚩业务层 🚩数据层 🌴前端代码…...

Vue学习教程-14内置指令

文章目录 前言一、v-text指令二、v-html指令三、v-cloak指令四、v-once指令五、v-pre指令六、其他指令 前言 Vue.js 提供了许多内置指令(Directives),这些指令用于在模板中添加特殊功能。内置指令以 v- 前缀开始。 v-text : 更新元素的 tex…...

【蓝桥杯单片机】客观题

一、第十三届省赛(一) 二、第十三届省赛(二)...

C++ 设计模式-访问者模式

C++访问者模式 一、模式痛点:当if-else成为维护噩梦 开发动物园管理系统,最初的需求很简单: class Animal {}; class Cat : public Animal {}; class Dog : public Animal {};// 处理动物叫声 void makeSound(Animal* a) {if (auto c = dynamic_cast<Cat*>(a)) {st…...

靶场之路-Kioptix Level-1 mod_ssl 缓冲区溢出漏洞

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章笔记的只是方便各位师傅学习知识,以下网站涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一、准备工作 首先使用 vmware 导入靶机文件&#xff0c; 然后网络模式改成 nat 模式即可 我们打…...

【Viewer.js】vue3封装图片查看器

效果图 需求 点击图片放大可关闭放大的 图片 下载 cnpm in viewerjs状态管理方法 stores/imgSeeStore.js import { defineStore } from pinia export const imgSeeStore defineStore(imgSeeStore, {state: () > ({showImgSee: false,ImgUrl: ,}),getters: {},actions: {…...

stm32mp采用spi接口扩展can

在 STM32MP 系列微处理器中,通过 SPI 转 CAN 功能扩展 CAN 接口需要结合硬件设计(如使用 SPI 接口的 CAN 控制器芯片)和 Linux 驱动配置。以下是详细的实现步骤和关键点: 硬件选型与连接 常用 SPI 转 CAN 芯片MCP2515:经典 SPI 转 CAN 控制器,支持 CAN 2.0B。MCP2517FD:…...

forge-1.21.x模组开发(二)给物品添加功能

功能效果 创建一个兑换券&#xff0c;当使用兑换券对着兑换机右键时&#xff0c;获得一条烤鱼 创建兑换券 创建ExchangeCouponsItem.java&#xff0c;继承Item&#xff0c;定义兑换券内容 public class ExchangeCouponsItem extends Item {public ExchangeCouponsItem(Prop…...

创建第一个 Maven 项目(一)

一、引言 在 Java 开发的广袤天地中&#xff0c;Maven 宛如一位全能的管家&#xff0c;发挥着举足轻重的作用。它是一个基于项目对象模型&#xff08;POM&#xff09;的项目管理和构建自动化工具&#xff0c;极大地简化了 Java 项目的开发流程。 Maven 的核心优势之一在于其强…...

网络运维学习笔记 022 HCIA-Datacom新增知识点03园区网典型组网架构及案例实战

园区网典型组网架构及案例实战 园区网&#xff1a;内部运行了园区网协议的一个主体网络 园区网络典型架构 园区网络常用协议与技术&#xff1a; 接入层&#xff1a; VLAN、生成树、链路聚合、AAA、dhcp-snooping等 汇聚层&#xff1a;DHCP、堆叠、链路聚合、生成树、OSPF、静…...

python-leetcode-二叉树的直径

543. 二叉树的直径 - 力扣&#xff08;LeetCode&#xff09; # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solutio…...

ubuntu中打包与压缩命令详解

Ubuntu 中打包与压缩命令详解 在 Ubuntu 系统中&#xff0c;打包和压缩文件是常见的操作。通过打包和压缩&#xff0c;可以将多个文件或目录合并为一个文件&#xff0c;并减小文件大小以节省存储空间或方便传输。本文将详细介绍 Ubuntu 中常用的打包与压缩命令及其用法。 目录…...

Linux MySQL 8.0.29 忽略表名大小写配置

Linux MySQL 8.0.29 忽略表名大小写配置 问题背景解决方案遇到的问题&#xff1a; 问题背景 突然发现有个大写的表报不存在。 在Windows上&#xff0c;MySQL是默认支持忽略大小写的。 这个时候你要查询一下是不是没有配置&#xff1a; SHOW VARIABLES LIKE lower_case_table…...

智能视觉组比赛软件Bug趣味文案(适配女生快速朗读)

简 介&#xff1a; 《智能车比赛惊现"隧道穿越"BUG&#xff01;该修还是该留&#xff1f;》 近日&#xff0c;智能视觉组比赛中出现了一个令人啼笑皆非的软件BUG&#xff1a;当车模进入虚拟墙体的死胡同时&#xff0c;虚拟车模会被"卡死"&#xff0c;而实体…...

Navicat导出Excel表格数据为空如何解决_过滤条件与权限排查

...

Ai2Psd终极指南:如何彻底解决Illustrator到Photoshop的矢量转换难题

Ai2Psd终极指南&#xff1a;如何彻底解决Illustrator到Photoshop的矢量转换难题 【免费下载链接】ai-to-psd A script for prepare export of vector objects from Adobe Illustrator to Photoshop 项目地址: https://gitcode.com/gh_mirrors/ai/ai-to-psd 你是否曾为Il…...

基于AD9850的高纯度正弦波VFO设计与实现

1. 项目概述&#xff1a;打造基于AD9850的高纯度正弦波VFO在业余无线电和电子实验领域&#xff0c;可变频率振荡器&#xff08;VFO&#xff09;是许多设备的核心部件。传统方案常采用Si5351这类芯片&#xff0c;但我在多次实测中发现&#xff0c;AD9850直接产生的正弦波信号纯度…...

保姆级教程:在Ubuntu 22.04上使用CH347T扩展I2C总线(驱动编译+库文件配置)

保姆级教程&#xff1a;在Ubuntu 22.04上使用CH347T扩展I2C总线&#xff08;驱动编译库文件配置&#xff09; 最近在调试一块嵌入式开发板时&#xff0c;发现树莓派的原生I2C接口不够用&#xff0c;于是尝试用CH347T这款USB转接芯片来扩展I2C总线。折腾过程中踩了不少坑&#x…...

别再为CANoe工程配置发愁了!手把手教你从零搭建一个真实的2路CAN总线仿真环境(附DBC文件加载技巧)

从零构建2路CAN总线仿真环境&#xff1a;CANoe实战避坑指南 当第一次打开Vector CANoe软件时&#xff0c;许多工程师会被复杂的界面和配置选项所困扰。特别是当需要搭建一个真实的2路CAN总线仿真环境时&#xff0c;从License检查到DBC文件加载的每个环节都可能成为新手的技术陷…...

番茄小说下载器完整指南:一键将在线小说转为EPUB电子书和有声读物

番茄小说下载器完整指南&#xff1a;一键将在线小说转为EPUB电子书和有声读物 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 你是否曾在网络信号不佳时无法追更小说&#xff…...

华为Pura 90系列发布:2亿智拍+XMAGE智拍,色彩准确度提升43%,4月29日开售

华为Pura 90系列&#xff1a;开启2亿智拍新时代4月20日&#xff0c;华为正式发布新一代2亿智拍旗舰——HUAWEI Pura 90系列。该系列兼具智慧影像与情绪美学双重突破&#xff0c;以软硬芯AI完美融合&#xff0c;带来“懂你更出片”的创作体验。情绪色彩美学与光影互动体验HUAWEI…...

【Linux内核网络】cfg80211与mac80211协同架构深度解析(基于Linux 5.x)

1. 理解Linux无线网络的核心架构 如果你拆开过家里的无线路由器&#xff0c;可能会发现里面有两块重要的芯片&#xff1a;一块负责处理无线信号&#xff08;射频芯片&#xff09;&#xff0c;另一块负责运行操作系统和网络协议&#xff08;主控芯片&#xff09;。Linux内核中的…...

3步解锁B站专业直播:开源工具的终极自由方案

3步解锁B站专业直播&#xff1a;开源工具的终极自由方案 【免费下载链接】bilibili_live_stream_code 用于在准备直播时获取第三方推流码&#xff0c;以便可以绕开哔哩哔哩直播姬&#xff0c;直接在如OBS等软件中进行直播&#xff0c;软件同时提供定义直播分区和标题功能 项目…...