Squashed 'paste-framework/' content from commit 34e8684
git-subtree-dir: paste-framework git-subtree-split: 34e8684c4bc3cebbe177509f42ab4ef5b5425a7a
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user