Files
webstatus/status/serializers.py
xiaji 16e3b14984 增加了api功能:
创建API文档页面 :新建了 status/templates/status/api_docs.html 模板文件,包含:

- API认证方式说明
- 所有API端点的详细说明(POST /api/checkin/、GET /api/services/、GET /api/services/{id}/history/、GET /api/status-summary/)
- 每个端点的请求体和响应体示例
- 状态码和检测类型的说明
2025-09-07 19:51:04 +08:00

96 lines
3.3 KiB
Python

from rest_framework import serializers
from .models import ServiceGroup, Service, ServiceCheckRecord
# 引入loguru库用于日志记录
try:
from loguru import logger
except ImportError:
import logging
logger = logging.getLogger(__name__)
class ServiceGroupSerializer(serializers.ModelSerializer):
class Meta:
model = ServiceGroup
fields = '__all__'
class ServiceCheckRecordSerializer(serializers.ModelSerializer):
class Meta:
model = ServiceCheckRecord
fields = '__all__'
class ServiceSerializer(serializers.ModelSerializer):
latest_status = serializers.CharField(source='get_latest_status', read_only=True)
latest_check_time = serializers.DateTimeField(source='get_latest_check_time', read_only=True)
latest_response_time = serializers.FloatField(source='get_latest_response_time', read_only=True)
class Meta:
model = Service
fields = '__all__'
class ServiceCheckInSerializer(serializers.Serializer):
"""客户端上报数据序列化器"""
service_name = serializers.CharField(max_length=200)
host = serializers.CharField(max_length=255)
port = serializers.IntegerField(required=False, allow_null=True)
check_type = serializers.CharField(max_length=50, default='tcp')
status = serializers.ChoiceField(choices=Service.STATUS_CHOICES)
response_time = serializers.FloatField(required=False, allow_null=True)
message = serializers.CharField(required=False, allow_blank=True)
def create(self, validated_data):
"""创建或更新服务记录"""
service_name = validated_data['service_name']
host = validated_data['host']
port = validated_data.get('port')
check_type = validated_data.get('check_type', 'tcp')
status = validated_data['status']
response_time = validated_data.get('response_time')
message = validated_data.get('message', '')
logger.info(f"收到服务上报: {service_name} ({host}:{port}), 状态: {status}")
# 获取或创建默认分组
group_name = 'Default'
group, created = ServiceGroup.objects.get_or_create(name=group_name)
if created:
logger.info(f"创建默认分组: {group_name}")
# 获取或创建服务
service, created = Service.objects.get_or_create(
name=service_name,
host=host,
port=port,
check_type=check_type,
defaults={'group': group}
)
if created:
logger.info(f"创建新服务: {service_name} ({host}:{port})")
# 创建检测记录
record = ServiceCheckRecord.objects.create(
service=service,
status=status,
response_time=response_time,
message=message
)
logger.info(f"保存检测记录: {service_name}, 状态: {status}, 响应时间: {response_time}ms")
return {
'service_id': service.id,
'record_id': record.id
}
class StatusSummarySerializer(serializers.Serializer):
"""状态摘要序列化器"""
total_services = serializers.IntegerField()
up_services = serializers.IntegerField()
down_services = serializers.IntegerField()
unknown_services = serializers.IntegerField()
uptime_percentage = serializers.FloatField()