自学内容网 自学内容网

odoo使用SSE

目录

1. 原理解释

 2. 配置步骤

2.1 准备环境

2.2 添加 Odoo 控制器

 3. 实现代码

3.1 自定义模块结构

3.2 模块文件

__manifest__.py

4. 客户端实现

5. 注意事项

HTTP/2 配置确保反向代理支持 SSE。配置 Nginx 示例:

 2.客户端连接管理SSE 是单向的,适用于服务端主动推送的场景。客户端不能直接发消息到服务端。

3.性能优化

4.兼容性

 6. 扩展功能


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. 注意事项

  1. 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)!