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 可能更适合你。

相关推荐
一眼万里*e2 分钟前
fish-speech语音大模型本地部署
python·flask·大模型
结衣结衣.24 分钟前
python中的函数介绍
java·c语言·开发语言·前端·笔记·python·学习
程序员陆通25 分钟前
Spring Boot RESTful API开发教程
spring boot·后端·restful
茫茫人海一粒沙27 分钟前
Python 代码编写规范
开发语言·python
林浩23328 分钟前
Python——异常处理机制
python
数据分析螺丝钉1 小时前
力扣第240题“搜索二维矩阵 II”
经验分享·python·算法·leetcode·面试
无理 Java1 小时前
【技术详解】SpringMVC框架全面解析:从入门到精通(SpringMVC)
java·后端·spring·面试·mvc·框架·springmvc
小蜗笔记2 小时前
在Python中实现多目标优化问题(7)模拟退火算法的调用
开发语言·python·模拟退火算法
TANGLONG2222 小时前
【C语言】数据在内存中的存储(万字解析)
java·c语言·c++·python·考研·面试·蓝桥杯
魏大橙2 小时前
Fastjson反序列化
开发语言·python