4729698049
git-subtree-dir: paste-framework git-subtree-split: 34e8684c4bc3cebbe177509f42ab4ef5b5425a7a
69 lines
2.1 KiB
Python
69 lines
2.1 KiB
Python
import datetime
|
|
import json
|
|
import logging
|
|
|
|
from paste.core.logging import echo_log
|
|
from paste.db.redis import StreamActor
|
|
from paste.web.decorators import route
|
|
from paste.web.handler import RequestHandler
|
|
|
|
@route("/stream")
|
|
class MessageHandler(RequestHandler):
|
|
"""
|
|
演示请求发布 Redis Stream 消息。
|
|
"""
|
|
|
|
# 从配置中加载 Stream 配置路径
|
|
stream_config_path = "redis.streams.demo"
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
# 初始化 StreamActor 实例(按配置创建)
|
|
self.actor = StreamActor.new_actor(self.stream_config_path)
|
|
|
|
async def post(self):
|
|
"""
|
|
接收前端 POST 请求,发布消息到 Redis Stream,立即响应。
|
|
请求体格式:
|
|
{
|
|
"user_id": "123",
|
|
"event": "login",
|
|
"data": {"ip": "192.168.1.1"}
|
|
}
|
|
"""
|
|
try:
|
|
# 1. 获取请求参数
|
|
body = self.request_arguments()
|
|
user_id = body.get("user_id")
|
|
event = body.get("event")
|
|
data = body.get("data", {})
|
|
|
|
if not user_id or not event:
|
|
self.response_error(
|
|
Exception("参数缺失:必须提供 user_id 和 event"),
|
|
status_code=400,
|
|
api_status_code=400
|
|
)
|
|
return
|
|
|
|
# 2. 构造消息数据
|
|
message_data = {
|
|
"user_id": user_id,
|
|
"event": event,
|
|
"timestamp": datetime.datetime.now(datetime.timezone.utc).isoformat() + 'Z',
|
|
"data": json.dumps(data)
|
|
}
|
|
|
|
# 3. 异步发布消息(立即返回,不等待消费)
|
|
msg_id = await self.actor.publish(message_data)
|
|
|
|
# 4. 响应成功
|
|
self.response_ok(
|
|
message="消息已成功发布",
|
|
message_id=msg_id,
|
|
stream=self.stream_config_path
|
|
)
|
|
|
|
except Exception as e:
|
|
echo_log('异常', logging.ERROR, True)
|
|
self.response_error(e, status_code=500, api_status_code=500) |