python实现SSE服务器单向消息推送
2023-06-13 09:17:40 时间
前言
最近公司的web项目中需要使用到消息实时推送,能够及时将重要线索推送给责任人,一开始想的是采用较为成熟的WS方案。但经过需求分析后我认为在这个场景下,使用SSE更合适。
技术栈选择
主要原因如下:
- 消息业务是单向的,不需要双向的消息推送;相较于ws双工通道有更低的开销。
- 需求实现相较于WS更为简单,只需很少量的代码集成即可实现。
- 不限制开发语言,JAVA、Python等都可以实现。
- 浏览器支持SSE,不需要额外的代码。
- 相比于传统的http轮询,SSE更为减轻服务端压力和数据时效性。
其中,最核心的也就是:我们的需求是单向的消息推送。
目前业务代码是有JAVA同学来实现的,但是我不妨使用python也实现一下,万一以后需要呢?
基于FastAPI实现
- 安装依赖包
pip install "fastapi[all]"
pip install sse-starlette
完整代码实现:
# -*- coding: utf-8 -*-
import random
import asyncio
import uvicorn
from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from sse_starlette.sse import EventSourceResponse
app = FastAPI()
# 跨域设置,因为测试需要前端访问,所以允许所有域访问
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get('/stream')
async def stream(request: Request):
def new_count():
return random.randint(1, 100)
async def event_generator():
index = 0
while True:
index += 1
if await request.is_disconnected():
break
# 测试取随机数据,每次取一个随机数
if count := new_count():
yield {'data': count}
await asyncio.sleep(1)
return EventSourceResponse(event_generator())
if __name__ == '__main__':
uvicorn.run('main:app', reload=True)
接下来,开启服务,在浏览器访问:
http://127.0.0.1:8000/stream
可以观察到,随机数字间隔一秒输出。
既然我们都开启了跨越了,那试着将这个接口接入到web前端服务中。
基于Flask实现
相较于fastapi,flask更为极简。
pip install flask
# -*- coding: utf-8 -*-
import random
import time
from flask import Flask, Response
app = Flask(__name__)
@app.route('/stream')
def stream():
def new_count():
return random.randint(1, 100)
def eventStream():
while True:
if count := new_count():
yield 'id: %d\n' % id + 'data: %s\n\n' % count
time.sleep(1)
return Response(eventStream(), mimetype="text/event-stream")
if __name__ == '__main__':
app.run(debug=True, port=8888)
Javascript客户端
为了能够直接体验到SSE的魅力,在浏览器控制台键入以下代码即可链接服务端。
const source = new EventSource("http://127.0.0.1:8000/stream")
source.addEventListener('message', function (event) {
console.log(event.data)
}, false);
结语
以上是python实现sse的核心基础代码,而真正项目中则需要用到数据库等系列操作,包括消息分发给指定的接收人等等。本文主要是就业务场景而言,选择合适的技术来实现需求。
end.
参考:
相关文章
- 二级Python选择题_二级python选择题题库
- python语言变量命名规则有什么_Python变量命名规则(超级详细)
- python整除和取余写法_Python的整除和取余[通俗易懂]
- python解压bz2文件命令_解压缩bz2文件
- python判断linux中文件是否存在_Python判断文件是否存在的三种方法
- python监控网页内容变化_使用Python监控文件内容变化代码实例
- 【Python】python文件打开方式详解——a、a+、r+、w+、rb、rt区别[通俗易懂]
- Python编程 赋值,逻辑,位运算符
- 【说站】python setup和teardown的使用
- 【说站】python有哪些高级内置函数
- 配合python的rich库实现高颜值LOL服务器状态查询
- python django 数据库_Apache+Mysql+PHP/Python简单项目
- Python的基础知识_python的基本知识点
- 为什么requests不是python标准库?
- 麒麟服务器V10 版本 安装 Anaconda教程,也就是安装Python环境的教程(亲测有效)
- python怎么自定义异常
- python-Python与PostgreSQL数据库-使用Python执行PostgreSQL查询(二)
- python播放wav音频文件代码详解编程语言
- python操作mysql数据库代码详解编程语言
- Linux系统快速运行Python脚本(linux运行python脚本)
- python之内置函数详解编程语言
- 快速查询MySQL数据库:Python篇(python查询mysql数据库)
- 为什么 Python 开发人员应该使用 Pipenv
- Python脚本实现Linux系统管理及自动化部署(python写linux)
- Linux中如何离开Python环境(linux怎么退出python)
- python正则式概述及常用字符
- python函数返回多个值的示例方法
- python检测服务器是否正常
- python批量同步web服务器代码核心程序