django StreamingHttpResponse fetchEventSource实现前后端流试返回数据并接收数据的完整详细过程

django后端环境介绍:

Python 3.10.14
pip install django-cors-headers==4.4.0 Django==5.0.6 django-cors-headers==4.4.0 djangorestframework==3.15.2  -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
总环境如下:
Package             Version
------------------- -------
asgiref             3.8.1
Django              5.0.6
django-cors-headers 4.4.0
djangorestframework 3.15.2
pip                 24.2
setuptools          75.1.0
sqlparse            0.5.3
typing_extensions   4.12.2
wheel               0.44.0

1、创建项目

django-admin startproject event_stream_test
cd event_stream_test
python  manage.py  startapp  sse

总的目录结构如下:

在这里插入图片描述

event_stream_test/settings.py中的配置如下:

INSTALLED_APPS = [
......"sse.apps.SseConfig","corsheaders",
......
]
MIDDLEWARE = [
......"django.contrib.sessions.middleware.SessionMiddleware","corsheaders.middleware.CorsMiddleware", # 这个位置要在CommonMiddleware之前"django.middleware.common.CommonMiddleware",
......
]
# 允许跨域设置
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOW_ALL_ORIGINS = True
CORS_ALLOW_HEADERS = ('*')完整的settings设置如下:
"""
Django settings for event_stream_test project.Generated by 'django-admin startproject' using Django 4.2.For more information on this file, see
https://docs.djangoproject.com/en/4.2/topics/settings/For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.2/ref/settings/
"""
import os
from pathlib import Path# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = "django-insecure-u@my#&53d3%e79ox#u!rs0eprc$c)_2gbcezpdj0v^=_(!wwu-"# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = TrueALLOWED_HOSTS = []# Application definitionINSTALLED_APPS = ["django.contrib.admin","django.contrib.auth","django.contrib.contenttypes","django.contrib.sessions","django.contrib.messages","django.contrib.staticfiles","sse.apps.SseConfig","corsheaders",# "rest_framework"]MIDDLEWARE = ["django.middleware.security.SecurityMiddleware","django.contrib.sessions.middleware.SessionMiddleware","corsheaders.middleware.CorsMiddleware","django.middleware.common.CommonMiddleware","django.middleware.csrf.CsrfViewMiddleware","django.contrib.auth.middleware.AuthenticationMiddleware","django.contrib.messages.middleware.MessageMiddleware","django.middleware.clickjacking.XFrameOptionsMiddleware",
]ROOT_URLCONF = "event_stream_test.urls"TEMPLATES = [{"BACKEND": "django.template.backends.django.DjangoTemplates",# "DIRS": [os.path.join(BASE_DIR, 'sse/templates')],"DIRS": [],"APP_DIRS": True,"OPTIONS": {"context_processors": ["django.template.context_processors.debug","django.template.context_processors.request","django.contrib.auth.context_processors.auth","django.contrib.messages.context_processors.messages",],},},
]WSGI_APPLICATION = "event_stream_test.wsgi.application"# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databasesDATABASES = {"default": {"ENGINE": "django.db.backends.sqlite3","NAME": BASE_DIR / "db.sqlite3",}
}# Password validation
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validatorsAUTH_PASSWORD_VALIDATORS = [{"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",},{"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",},{"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",},{"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",},
]# Internationalization
# https://docs.djangoproject.com/en/4.2/topics/i18n/LANGUAGE_CODE = "en-us"TIME_ZONE = "UTC"USE_I18N = TrueUSE_TZ = True# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.2/howto/static-files/STATIC_URL = "static/"# Default primary key field type
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-fieldDEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOW_ALL_ORIGINS = True
CORS_ALLOW_HEADERS = ('*')

event_stream_test/urls.py中的配置如下:

from django.contrib import admin
from django.urls import path, includeurlpatterns = [path("admin/", admin.site.urls),path('v1/sse/', include('sse.urls'))
]

sse/urls.py中的配置如下:

from django.urls import path
from sse import viewsurlpatterns = [# SSEpath('demo', views.DemoAPIView.as_view()),
]

sse/views.py中的配置如下:

import time
from django.http import StreamingHttpResponse
from rest_framework.views import APIViewclass DemoAPIView(APIView):# def post(self, request):def get(self, request):# 定义一个生成器,持续输出数据流def event_stream():# 测试读取当前文件# with open('sse/1.txt', mode="r", encoding='utf-8') as file:#     for line in file:#         time.sleep(3)#         yield f'data: {line}\n\n'#count = 0while True:count = count+1line = "当前行号是"+str(count)yield f'data: {line}\n\n'time.sleep(3)response = StreamingHttpResponse(event_stream(), content_type='text/event-stream; charset=utf-8',headers={'Cache-Control': 'no-cache'}, status=200)return response

至此配置django配置已经完成,运行项目则可以直接在浏览器中看到结果:

python manage.py runserver然后在浏览器中输入:
http://127.0.0.1:8000/v1/sse/demo
即可看到如下内容,会一直不停地打印

在这里插入图片描述

前端环境介绍:

"dependencies": {"@microsoft/fetch-event-source": "^2.0.1","vue": "^3.5.13"},

需要安装npm i @microsoft/fetch-event-source
最好版本一致

Vue3代码如下(App.vue下)

<template><h1>这是测试页</h1><h1 v-for="item in data" style="color: red">{{ item }}</h1>
</template><script setup>
import {ref, onMounted, onUnmounted} from "vue";
import {fetchEventSource} from '@microsoft/fetch-event-source';
const controller = new AbortController();
const data = ref([])
const connectSSE = async () => {const url = "http://127.0.0.1:8000/v1/sse/demo"console.log(url)await fetchEventSource(url, {method: 'GET',headers: {'Accept': '*/*',  // 这个很重要// "Content-Type": "text/event-stream"},// 发送请求的内容可以放在body中// body: JSON.stringify({//   "type": "auto",//   "text": "阿斯蒂芬",//   "background": "",//   "messages": [],//   "meta_data": {}// }),signal: controller.signal,openWhenHidden: true, // 当不在当前页面时页面依然能不间断的接收数据onmessage: async (event) => {console.log('event', event)// console.log("JSON.parse(event.data)===》", JSON.parse(event.data))// console.log('event.data.split("是")', event.data.split("是"));let num = parseInt(event.data.split("是")[1])console.log("num", num)if (num === 3){console.log("终止进程没")  // 在上边写这个signal: controller.signal,在这写controller.abort()可以终止接收后端的推送controller.abort()}else {data.value.push(event.data)}},onerror(err) {console.error('Error:', err);if (err.status === 500) {// 服务器错误时重新连接setTimeout(() => connectSSE(), 5000);}},onopen(response) {if (response.ok) {console.log('Connection start');}},onclose() {console.log('Connection close');}})
}
onMounted(() => {connectSSE();
});
onUnmounted(() => {
});
</script>

运行前端项目npm run dev 并打开前端页面,展示结果如下:

在这里插入图片描述

如果把前端中的这段代码替换成data.value.push(event.data)

//if (num === 3){
// console.log("终止进程没")  // 在上边写这个signal: controller.signal,在这写controller.abort()可以终止接收后端的推送
//  controller.abort()
//}else {
//  data.value.push(event.data)
//}
替换为:
data.value.push(event.data)

则效果如下:会一直打印,不会终止接收,所以controller.abort()得作用就是终止接收后端的推送

在这里插入图片描述

如果把openWhenHidden: true,也给注释了则在切换页面后会重新接收数据,效果如下

在这里插入图片描述
跨域设置可参考
流试说明可参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/501818.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka为什么快(高性能的原因)

我们知道&#xff0c;Kafka 是基于磁盘存储的&#xff0c;但它却又具有高性能、高吞吐、低延时等特点&#xff0c;吞吐量可达几十上百万。那么 Kafka 这么快的原因是什么呢&#xff1f; Kafka 高性能主要取决于以下几方面&#xff1a; &#xff08;1&#xff09;消息批处理压缩…

Luma AI 简单几步生成视频

简单几步生成视频 登录我们的 AceDataPlatform 网站&#xff0c;按照下图所示即可生成高质量的视频&#xff0c;同时&#xff0c;我们也提供了简单易用的 API 方便集成调用&#xff0c;可以查看 Luma API了解详情 技术介绍 我们使用了 Luma 的技术&#xff0c;实现了上面的图…

Postman[7] 内置动态参数及自定义的动态参数

postman 内置动态参数和自定义的动态参数 1.内置动态参数 格式&#xff1a;{{$参数名}} 1.1时间戳 {{$timestamp}} //生成当前时间的时间戳 1.2随机整数 {{$randomint}} //生成0-1000之间的随机数 1.3GUID字符串 {{$guid}} //生成随机GUID字符串 2.自定义动态参数 格式…

Excel VBA 自动填充空白并合并相同值的解决方案

文章目录 Excel VBA: 自动填充空白并合并相同值的解决方案问题背景解决方案1. VBA代码实现2. 代码说明3. 使用方法4. 注意事项 扩展优化总结 Excel VBA: 自动填充空白并合并相同值的解决方案 问题背景 在Excel中经常会遇到这样的数据处理需求&#xff1a;一列数据中存在多个空…

STM32-笔记32-ESP8266作为服务端

esp8266作为服务器的时候&#xff0c;这时候网络助手以客户端的模式连接到esp8266&#xff0c;其中IP地址写的是esp8266作为服务器时的IP地址&#xff0c;可以使用ATCIFSR查询esp8266的ip地址&#xff0c;端口号默认写333。 当esp8266作为服务器的时候&#xff0c;需要完成哪些…

JavaScript性能

随着应用规模的增长&#xff0c;JavaScript 性能的优化变得尤为重要。这篇文章将分享 10 个实用的优化技巧&#xff0c;帮助开发者提升前端性能。 减少 DOM 操作 操作 DOM 是性能瓶颈。将多个操作合并到一个操作中&#xff0c;或者使用虚拟 DOM&#xff08;如 React&#xff…

组网实训实现

小型单元网络实现 IP划分&#xff1a; 外网:172.1.1.0/24 172.1.2.0/24 内网&#xff1a;基于192.168.3.0/24的子网划分 综合办公楼&#xff1a;192.168.3.00 000000 /26&#xff08;192.168.3.0-192.168.3.63&#xff09; 综合一楼&#xff1a;192.168.3.0000 0000 /28&…

GIT 企业级开发学习 1_基本操作

本节主要命令&#xff1a; git init ls 不能列出 .git ls -a 列出 .git 创建本地仓库 1. 初始化 Git 仓库 git init • 初始化一个新的 Git 仓库&#xff0c;在当前目录下生成一个 .git 隐藏文件夹&#xff0c;用于存储版本控制信息。 2. 查看隐藏文件 ls -a • 使用 ls …

Elasticsearch:利用 AutoOps 检测长时间运行的搜索查询

作者&#xff1a;来自 Elastic Valentin Crettaz 了解 AutoOps 如何帮助你调查困扰集群的长期搜索查询以提高搜索性能。 AutoOps 于 11 月初在 Elastic Cloud Hosted 上发布&#xff0c;它通过性能建议、资源利用率和成本洞察、实时问题检测和解决路径显著简化了集群管理。 Au…

《learn_the_architecture_-_generic_interrupt_controller_v3_and_v4__lpisn》学习笔记

1.LPI&#xff08;Locality-specific Peripheral Interrupts&#xff09;是一种基于消息的中断&#xff08;Message Signaled Interrupt&#xff0c;MSI&#xff09;&#xff0c;由中断翻译服务(ITS)提供翻译。这是因为LPI的设计目标是为系统中大量的设备提供高效的中断管理&am…

SD下载、安装、使用、卸载-Stable Diffusion整合包v4.10发布!

目录 前言概述 SD安装1、安装软件2、启动3、配置4、运行5、测试 导入SD模型【决定画风】常用模型下载安装模型 SD卸载SD文生图提示词提示词使用技巧提示词的高级使用技巧强调关键词 前言 我向来不喜欢搞一些没有用的概念&#xff0c;所以直接整理可能用到的东西。 sd简单的说…

性能测试03|JMeter:断言、关联、web脚本录制

目录 一、断言 1、响应断言 2、json断言 3、持续时间断言 二、关联 1、正则表达式介绍 2、正则表达式提取器 3、Xpath提取器 4、JSON提取器 5、JMeter属性 三、web脚本录制 一、断言 定义&#xff1a;让程序自动判断实际的返回结果是否与预期结果保持一致 自动校验…

GitHub Fork 和 Clone 的深度指南:操作解析与 Pull Request 完整流程20241231

GitHub Fork 和 Clone 的深度指南&#xff1a;操作解析与 Pull Request 完整流程 快速导航 引言Fork 与 Clone 概念对比完整开发流程Pull Request 最佳实践常见问题与解决方案最佳实践建议实战案例 引言 在开发者的协作世界中&#xff0c;GitHub 就像一座桥梁&#xff0c;连…

『 Linux 』高级IO (三) - Epoll模型的封装与EpollEchoServer服务器

文章目录 前情提要Epoll 的封装Epoll封装完整代码(供参考) Epoll Echo ServerEpoll Echo Server 测试及完整代码 前情提要 在上一篇博客『 Linux 』高级IO (二) - 多路转接介绍并完成了两种多路转接方案的介绍以及对应多路转接方案代码的编写,分别为SelectServer服务器与PollSe…

vue路由模式面试题

vue路由模式 1.路由的模式有哪些?有什么区别? history和hash模式 区别: 1.表现的形态不同: 在地址栏url中:hash模式中带有**#**号,history没有 2.请求错误时表现不同: 在hash模式中,对于404地址请求时,不会进行请求 但是在history模式中,对于404请求时,仍然会进行请求…

Docker安装Prometheus和Grafana

概念简述 安装prometheus 第一步&#xff1a;确保安装有docker 第二步&#xff1a;拉取镜像 第三步&#xff1a;准备相关挂载目录及文件 第四步&#xff1a;启动容器 第五步&#xff1a;访问测试 安装grafana 第一步&#xff1a;确保安装有docker 第二步&#xff1a;拉…

UE5失真材质

渐变材质函数&#xff1a;RadialGradientExponential&#xff08;指数径向渐变&#xff09; 函数使用 UV 通道 0 来产生径向渐变&#xff0c;同时允许用户调整半径和中心点偏移。 用于控制渐变所在的位置及其涵盖 0-1 空间的程度。 基于 0-1 的渐变中心位置偏移。 源自中心的径…

Android授权USB使用权限示例

使用效果&#xff1a; 授权实现过程&#xff1a; 1.在AndroidManifest.xml中增加android.hardware.usb.action.USB_DEVICE_ATTACHED的action及meta-data action: <action android:name"android.hardware.usb.action.USB_DEVICE_ATTACHED"/> meta-data: &l…

matlab时频分析库

time frequency gallery

算法题(25):只出现一次的数字(三)

审题&#xff1a; 该题中有两个元素只出现一次并且其他元素都出现两次&#xff0c;需要返回这两个只出现一次的数&#xff0c;并且不要求返回顺序 思路: 由于对空间复杂度有要求&#xff0c;我们这里不考虑哈希表。我们采用位运算的方法解题 方法&#xff1a;位运算 首先&#…