python django Stream 流式处理网络请求

stram 简介

text/event-stream 是一种数据格式,通常用于服务器向客户端发送实时更新的数据。这种格式常用于实现 Server-Sent Events (SSE)。 Server-Sent Events 允许服务器端主动向客户端推送数据,而不需要客户端轮询请求。它使用 HTTP 协议,并且保持连接始终打开,以便服务器可以随时发送更新的数据给客户端。

django 使用

在 Django 中,你可以使用 StreamingHttpResponse 类来发送 text/event-stream 格式的数据。StreamingHttpResponse 是 HttpResponse 的子类,它允许你以流的形式发送响应数据,而不是一次性将所有数据加载到内存中。

views.py

python 复制代码
# 在这里我们做了服务器主动断开,浏览器主动断开的功能的实现。
# 我们模拟主动给客户端发送50次响应,每次耗时1秒,当发送到20次服务器主动断开

def test_header(reuqest):
    import datetime
    import time
    from django.http import StreamingHttpResponse

    def event_stream():
        for i in range(50):
            try:
                time.sleep(1)
                if i == 20:
                    print('服务端主动断开')
                    return  # or break
                yield_data = 'data: The 中文 time is: %s\n\n' % datetime.datetime.now()
                print('我在发送数据: {}'.format(yield_data))
                yield yield_data

            except GeneratorExit:  # 用户主动断开走此方法
                print('客户端断开了')
                return  # or break
    return StreamingHttpResponse(event_stream(), content_type='text/event-stre
    

# 模拟首页
def xxx(request):
    return render(request, '2023_test_websocket.html')

url.py

python 复制代码
from django.urls import re_path
from test_stream import views

urlpatterns = [
    re_path(r'^test_headers/$', views.test_header),
    re_path(r'^xxxxx/$', views.xxx)]

settings.py

python 复制代码
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')],
        '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',
            ],
        },
    },
]

html

templates/2023_test_websocket.html 注意这个templates路径要在settings->TEMPLATES->DIRS找得到

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    {#  访问此页面就会建立链接  #}
    let ret = new EventSource('http://127.0.0.1:8000/test_headers/')

    {# 响应正确的处理 #}
    ret.onmessage = function (event) {
        console.log(event.data)
    }
    {# 响应错误的处理 主动断开 #}
    ret.onerror = function (error) {
        console.log(error)
        ret.close()
    }
</script>
</body>
</html>

效果展示

event-streamWebSocket 关系

event-streamWebSocket 都是用于实现实时通信的技术,但是它们有一些关键的区别:

  1. 连接方式event-stream 使用的是 HTTP 协议,并且保持连接始终打开,以便服务器可以随时发送更新的数据给客户端。而 WebSocket 是一种独立的协议,它通过一个特殊的握手过程建立一个全双工的、持久的连接。
  2. 数据格式event-stream 使用简单的文本数据格式,每一行包含一个事件类型和数据。而 WebSocket 可以传输任何类型的数据,包括二进制数据,并且支持更多的控制帧和消息类型。
  3. 双向通信event-stream 只允许服务器向客户端发送数据,而不能接收来自客户端的数据。而 WebSocket 支持双向通信,即服务器和客户端都可以发送数据给对方。
  4. 实现复杂性event-stream 的实现相对简单,只需要在服务器端生成事件数据并在客户端订阅这些事件即可。而 WebSocket 的实现要复杂一些,需要处理握手过程、错误处理、心跳检测等。
  5. 跨域支持event-stream 可以使用标准的 CORS 机制来支持跨域请求。而 WebSocket 也有自己的跨域机制,但需要在服务器端进行配置。
  6. 浏览器兼容性event-stream 在所有现代浏览器中都得到了很好的支持。而 WebSocket 在较旧的浏览器中可能不被支持,需要使用 polyfill 或者回退到其他技术(如轮询)。

综上所述,event-streamWebSocket 各有优缺点,适用于不同的应用场景。如果你只需要单向通信,并且不需要处理复杂的实时数据,那么 event-stream 可能是一个更好的选择。如果你需要双向通信或者处理大量实时数据,那么 WebSocket 可能更适合你。

相关推荐
羊小猪~~18 分钟前
MYSQL学习笔记(九):MYSQL表的“增删改查”
数据库·笔记·后端·sql·学习·mysql·考研
豌豆花下猫34 分钟前
Python 潮流周刊#90:uv 一周岁了,优缺点分析(摘要)
后端·python·ai
橘猫云计算机设计1 小时前
基于SSM的《计算机网络》题库管理系统(源码+lw+部署文档+讲解),源码可白嫖!
java·数据库·spring boot·后端·python·计算机网络·毕设
小伍_Five1 小时前
从0开始:OpenCV入门教程【图像处理基础】
图像处理·python·opencv
m0_748245341 小时前
python——Django 框架
开发语言·python·django
熬夜苦读学习1 小时前
Linux文件系统
linux·运维·服务器·开发语言·后端
java1234_小锋2 小时前
一周学会Flask3 Python Web开发-客户端状态信息Cookie以及加密
前端·python·flask·flask3
坚定信念,勇往无前2 小时前
Spring Boot 如何保证接口安全
spring boot·后端·安全
B站计算机毕业设计超人2 小时前
计算机毕业设计Python+DeepSeek-R1高考推荐系统 高考分数线预测 大数据毕设(源码+LW文档+PPT+讲解)
大数据·python·机器学习·网络爬虫·课程设计·数据可视化·推荐算法
begei3 小时前
在Django中安装、配置、使用CKEditor5,并将CKEditor5录入的文章展现出来,实现一个简单博客网站的功能
数据库·django·sqlite