from django.shortcuts import render import psutil from rest_framework.response import Response from rest_framework.views import APIView from rest_framework.permissions import IsAuthenticated from django.conf import settings import os from rest_framework import serializers from drf_yasg import openapi from drf_yasg.utils import swagger_auto_schema from rest_framework.exceptions import NotFound from rest_framework.mixins import ListModelMixin from apps.ops.filters import DrfLogFilterSet from apps.ops.models import DrfRequestLog from rest_framework.viewsets import GenericViewSet from apps.ops.errors import LOG_NOT_FONED from rest_framework.decorators import action # Create your views here. class CpuView(APIView): permission_classes = [IsAuthenticated] def get(self, request, *args, **kwargs): """ 获取服务器cpu当前状态 获取服务器cpu当前状态 """ ret = {'cpu': {}} ret['cpu']['count'] = psutil.cpu_count() ret['cpu']['lcount'] = psutil.cpu_count(logical=False) ret['cpu']['percent'] = psutil.cpu_percent(interval=1) return Response(ret) class MemoryView(APIView): permission_classes = [IsAuthenticated] def get(self, request, *args, **kwargs): """ 获取服务器内存当前状态 获取服务器内存当前状态 """ ret = {'memory': {}} memory = psutil.virtual_memory() ret['memory']['total'] = round(memory.total/1024/1024/1024, 2) ret['memory']['used'] = round(memory.used/1024/1024/1024, 2) ret['memory']['percent'] = memory.percent return Response(ret) class DiskView(APIView): permission_classes = [IsAuthenticated] def get(self, request, *args, **kwargs): """ 获取服务器硬盘当前状态 获取服务器硬盘当前状态 """ ret = {'disk': {}} disk = psutil.disk_usage('/') ret['disk']['total'] = round(disk.total/1024/1024/1024, 2) ret['disk']['used'] = round(disk.used/1024/1024/1024, 2) ret['disk']['percent'] = disk.percent return Response(ret) def get_file_list(file_path): dir_list = os.listdir(file_path) if not dir_list: return else: # 注意,这里使用lambda表达式,将文件按照最后修改时间顺序升序排列 # os.path.getmtime() 函数是获取文件最后修改时间 # os.path.getctime() 函数是获取文件最后创建时间 dir_list = sorted(dir_list, key=lambda x: os.path.getmtime( os.path.join(file_path, x)), reverse=True) # print(dir_list) return dir_list class LogView(APIView): @swagger_auto_schema(manual_parameters=[ openapi.Parameter('name', openapi.IN_QUERY, description='日志文件名', type=openapi.TYPE_STRING) ]) def get(self, request, *args, **kwargs): """ 查看最近的日志列表 查看最近的日志列表 """ logs = [] name = request.GET.get('name', None) # for root, dirs, files in os.walk(settings.LOG_PATH): # files.reverse() for file in get_file_list(settings.LOG_PATH): if len(logs) > 50: break filepath = os.path.join(settings.LOG_PATH, file) if name: if name in filepath: fsize = os.path.getsize(filepath) if fsize: logs.append({ "name": file, "filepath": filepath, "size": round(fsize/1024, 1) }) else: fsize = os.path.getsize(filepath) if fsize: logs.append({ "name": file, "filepath": filepath, "size": round(fsize/1024, 1) }) return Response(logs) class LogDetailView(APIView): def get(self, request, name): """ 查看日志详情 查看日志详情 """ try: with open(os.path.join(settings.LOG_PATH, name)) as f: data = f.read() return Response(data) except Exception: raise NotFound(**LOG_NOT_FONED) class DrfRequestLogSerializer(serializers.ModelSerializer): class Meta: model = DrfRequestLog fields = '__all__' class DrfRequestLogViewSet(ListModelMixin, GenericViewSet): """请求日志 请求日志 """ perms_map = {'get': '*'} queryset = DrfRequestLog.objects.all() serializer_class = DrfRequestLogSerializer ordering = ['-requested_at'] filterset_class = DrfLogFilterSet @action(methods=['delete'], detail=False, perms_map = {'delete':'log_delete'}) def clear(self, request, *args, **kwargs): """ 清空日志 """ DrfRequestLog.objects.all().delete() return Response()