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)