odoo使用SSE
目录
HTTP/2 配置确保反向代理支持 SSE。配置 Nginx 示例:
2.客户端连接管理SSE 是单向的,适用于服务端主动推送的场景。客户端不能直接发消息到服务端。
1. 原理解释
SSE 是一种服务端到客户端的单向通信方式,客户端(浏览器)通过一个持续的 HTTP 连接接收服务器发送的实时数据。
在 Odoo 中,SSE 可以用于实时数据展示,例如服务器监控、订单更新等。
2. 配置步骤
2.1 准备环境
确保你的 Odoo 部署支持 SSE:
- 使用现代浏览器(SSE 浏览器兼容性良好)。
- 反向代理(如 Nginx)需正确配置以支持长时间打开的 HTTP 请求。
2.2 添加 Odoo 控制器
创建一个自定义模块,在其中编写控制器处理 SSE 数据流。
3. 实现代码
3.1 自定义模块结构
模块目录结构:
custom_addons/
└── sse_demo/
├── __init__.py
├── __manifest__.py
├── controllers/
│ ├── __init__.py
│ └── sse_controller.py
├── models/
│ ├── __init__.py
│ └── demo_model.py
3.2 模块文件
__manifest__.py
{
'name': 'SSE Demo',
'version': '1.0',
'depends': ['base', 'web'],
'data': [],
'installable': True,
}
controllers/__init__.py
from . import sse_controller
controllers/sse_controller.py
import time
from odoo import http
from odoo.http import request
class SSEController(http.Controller):
@http.route('/sse/stream', type='http', auth='public', cors='*', csrf=False)
def sse_stream(self, **kwargs):
"""Sends a continuous stream of data to the client."""
def generate():
while True:
# Example: Sending current server time
data = f"data: Server time is {time.strftime('%Y-%m-%d %H:%M:%S')}\n\n"
yield data
time.sleep(1) # Control update frequency
# Set headers for SSE
headers = [('Content-Type', 'text/event-stream'), ('Cache-Control', 'no-cache')]
return request.make_response(generate(), headers=headers)
models/__init__.py
from . import demo_model
models/demo_model.py
from odoo import models, fields
class DemoModel(models.Model):
_name = 'sse.demo'
_description = 'Demo Model for SSE'
name = fields.Char(string='Name')
value = fields.Integer(string='Value')
4. 客户端实现
将以下代码放在 HTML 页面中
<!DOCTYPE html>
<html>
<head>
<title>SSE Demo</title>
</head>
<body>
<h1>Real-Time Updates</h1>
<pre id="data"></pre>
<script>
const eventSource = new EventSource('/sse/stream');
eventSource.onmessage = function(event) {
document.getElementById('data').innerText += event.data + '\n';
};
eventSource.onerror = function() {
console.error('SSE connection lost. Reconnecting...');
eventSource.close();
};
</script>
</body>
</html>
5. 注意事项
-
HTTP/2 配置
确保反向代理支持 SSE。配置 Nginx 示例:
location /sse/ {
proxy_pass http://127.0.0.1:8069;
proxy_set_header Connection keep-alive;
proxy_buffering off;
}
2.客户端连接管理
SSE 是单向的,适用于服务端主动推送的场景。客户端不能直接发消息到服务端。
3.性能优化
- 避免过多的频繁更新(如通过
time.sleep
控制频率)。 - 在高并发环境中,确保流数据生成逻辑不会消耗过多资源。
4.兼容性
SSE 适用于现代浏览器,但如果需要支持旧版浏览器或需要双向通信,应考虑 WebSocket。
6. 扩展功能
动态数据流:将数据库变更实时推送到客户端:
data = request.env['sse.demo'].search_read([], ['name', 'value'])
yield f"data: {json.dumps(data)}\n\n"
分组广播:实现不同用户组接收不同数据流,通过路由参数区分:
@http.route('/sse/stream/<string:group>', ...)
原文地址:https://blog.csdn.net/ohh11/article/details/143878651
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!