193 lines
7.6 KiB
Python
193 lines
7.6 KiB
Python
import logging
|
|
|
|
from django.db.models import Model
|
|
from rest_framework.request import Request
|
|
from rest_framework.views import APIView
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class ViewLogger(object):
|
|
"""
|
|
基于View视图的日志
|
|
"""
|
|
|
|
def __init__(self, view=None, request=None, *args, **kwargs) -> None:
|
|
super().__init__()
|
|
self.view = view
|
|
self.request = request
|
|
self.log_prefix: str = ''
|
|
|
|
def handle(self, request: Request, *args, **kwargs):
|
|
pass
|
|
|
|
|
|
class APIViewLogger(ViewLogger):
|
|
"""
|
|
(1)仅在op_drf.views.CustomAPIView的子类中生效
|
|
(2)使用: 请勿直接配置view_logger_classes = (APIViewLogger, ), 这样无效,
|
|
如有需求, 需要继承APIViewLogger重写其相应的方法
|
|
(3)重写handle()方法,所有请求均触发此方法
|
|
重写handle_get()方法,仅GET请求均触发此方法
|
|
重写handle_post()方法,仅POST请求均触发此方法
|
|
重写handle_put()方法,仅PUT请求均触发此方法
|
|
重写handle_delete()方法,仅DELETE请求均触发此方法
|
|
重写handle_xxx()方法,仅xxx请求均触发此方法
|
|
"""
|
|
|
|
def __init__(self, view=None, request=None, *args, **kwargs) -> None:
|
|
super().__init__()
|
|
self.view: APIView = view
|
|
self.request: Request = request
|
|
self.user = request.user
|
|
|
|
|
|
class ModelViewLogger(APIViewLogger):
|
|
"""
|
|
基础模型操作日志
|
|
(1)仅在op_drf.viewsets.GenericViewSet的子类中生效
|
|
(1)在CustomModelViewSet子类中配置: view_logger_classes = [ModelViewLogger, ]
|
|
(2)不要在op_drf中继续写具体的日志逻辑代码,
|
|
如有需求, 应该继承ModelViewLogger并且重写相应的方法, 例如CustomerModelViewLogger(涉及到其他模块时不要将代码放入op_drf)
|
|
"""
|
|
|
|
def __init__(self, view=None, request=None, *args, **kwargs) -> None:
|
|
super().__init__(view, request)
|
|
|
|
if hasattr(self.view.get_queryset(), 'model'):
|
|
self.model: Model = self.view.get_queryset().model
|
|
elif hasattr(self.view.get_serializer(), 'Meta') and hasattr(self.view.get_serializer().Meta, 'model'):
|
|
self.model: Model = self.view.get_serializer().Meta.model
|
|
|
|
|
|
class RelationshipViewLogger(APIViewLogger):
|
|
"""
|
|
关联关系模型操作日志
|
|
(1)在ModelRelationshipView子类中配置: view_logger_classes = [RelationshipViewLogger, ]
|
|
(2)不要在op_drf中继续写具体的日志逻辑代码,
|
|
如有需求, 应该继承RelationshipViewLogger并且重写相应的方法, 例如CustomerRelationshipViewLogger(涉及到其他模块时不要将代码放入op_drf)
|
|
"""
|
|
|
|
def __init__(self, view=None, request=None, instanceId=None, *args, **kwargs) -> None:
|
|
super().__init__(view, request)
|
|
self.instanceId: str = instanceId
|
|
|
|
def handle(self, request: Request, *args, **kwargs):
|
|
"""
|
|
每一次请求都会触发此方法
|
|
"""
|
|
|
|
pass
|
|
|
|
|
|
class CustomerRelationshipViewLogger(RelationshipViewLogger):
|
|
"""
|
|
(1)在ModelRelationshipView子类中配置: view_logger_classes = [CustomerRelationshipViewLogger, ]
|
|
"""
|
|
|
|
def __init__(self, view=None, request=None, instanceId=None, *args, **kwargs) -> None:
|
|
super().__init__(view, request, instanceId, *args, **kwargs)
|
|
self.log_prefix: str = 'RelationshipView日志系统:'
|
|
|
|
def handle_get(self, request: Request, *args, **kwargs):
|
|
"""
|
|
仅GET请求才会触发此方法
|
|
"""
|
|
pass
|
|
|
|
def handle_post(self, request: Request, *args, **kwargs):
|
|
"""
|
|
仅POST请求才会触发此方法
|
|
"""
|
|
operator = self.user.username
|
|
model_name = getattr(self.view.model, '_meta').verbose_name
|
|
to_field_name = self.view.to_field_name
|
|
to_model_name = getattr(self.view.relationship_model, '_meta').verbose_name
|
|
logger.info(
|
|
f'{self.log_prefix}用户[username={operator}]新增, {model_name}实例[{to_field_name}={self.instanceId}]与{to_model_name}的关联关系')
|
|
|
|
def handle_put(self, request: Request, *args, **kwargs):
|
|
"""
|
|
仅PUT请求才会触发此方法
|
|
"""
|
|
operator = self.user.username
|
|
model_name = getattr(self.view.model, '_meta').verbose_name
|
|
to_field_name = self.view.to_field_name
|
|
to_model_name = getattr(self.view.relationship_model, '_meta').verbose_name
|
|
logger.info(
|
|
f'{self.log_prefix}用户[username={operator}]重置, {model_name}实例[{to_field_name}={self.instanceId}]与{to_model_name}的关联关系')
|
|
|
|
def handle_delete(self, request: Request, *args, **kwargs):
|
|
"""
|
|
仅DELETE请求才会触发此方法
|
|
"""
|
|
operator = self.user.username
|
|
model_name = getattr(self.view.model, '_meta').verbose_name
|
|
to_field_name = self.view.to_field_name
|
|
to_model_name = getattr(self.view.relationship_model, '_meta').verbose_name
|
|
logger.info(
|
|
f'{self.log_prefix}用户[username={operator}]移除, {model_name}实例[{to_field_name}={self.instanceId}]与{to_model_name}的关联关系')
|
|
|
|
|
|
class CustomerModelViewLogger(ModelViewLogger):
|
|
def __init__(self, view=None, request=None, *args, **kwargs) -> None:
|
|
super().__init__(view, request, *args, **kwargs)
|
|
self.log_prefix: str = 'CustomModelViewSet日志系统:'
|
|
|
|
def handle(self, request: Request, *args, **kwargs):
|
|
pass
|
|
|
|
def handle_retrieve(self, request: Request, instance: Model = None, *args, **kwargs):
|
|
"""
|
|
仅retrieve(GET)请求才会触发此方法
|
|
"""
|
|
pass
|
|
operator = self.user.username
|
|
model_name = getattr(self.model, '_meta').verbose_name
|
|
logger.info(f'{self.log_prefix}用户[username={operator}]检索{model_name}:[{instance}]')
|
|
|
|
def handle_list(self, request: Request, *args, **kwargs):
|
|
"""
|
|
仅list(GET)请求才会触发此方法
|
|
"""
|
|
pass
|
|
operator = self.user.username
|
|
model_name = getattr(self.model, '_meta').verbose_name
|
|
logger.info(f'{self.log_prefix}用户[username={operator}]查询{model_name}')
|
|
|
|
def handle_create(self, request: Request, instance: Model = None, *args, **kwargs):
|
|
"""
|
|
仅create(POST)请求才会触发此方法
|
|
"""
|
|
pass
|
|
operator = self.user.username
|
|
model_name = getattr(self.model, '_meta').verbose_name
|
|
logger.info(f'{self.log_prefix}用户[username={operator}]创建{model_name}:[{instance}]')
|
|
|
|
def handle_update(self, request: Request, instance: Model = None, *args, **kwargs):
|
|
"""
|
|
仅update(PUT)请求才会触发此方法
|
|
"""
|
|
pass
|
|
operator = self.user.username
|
|
model_name = getattr(self.model, '_meta').verbose_name
|
|
logger.info(f'{self.log_prefix}用户[username={operator}]更新{model_name}:[{instance}]')
|
|
|
|
def handle_partial_update(self, request: Request, instance: Model = None, *args, **kwargs):
|
|
"""
|
|
仅partial_update(PATCH)请求才会触发此方法
|
|
"""
|
|
pass
|
|
operator = self.user.username
|
|
model_name = getattr(self.model, '_meta').verbose_name
|
|
logger.info(f'{self.log_prefix}用户[username={operator}]部分更新{model_name}:[{instance}]')
|
|
|
|
def handle_destroy(self, request: Request, instance: Model = None, *args, **kwargs):
|
|
"""
|
|
仅destroy(DELETE)请求才会触发此方法
|
|
"""
|
|
pass
|
|
operator = self.user.username
|
|
model_name = getattr(self.model, '_meta').verbose_name
|
|
logger.info(f'{self.log_prefix}用户[username={operator}]删除{model_name}:[{instance}]')
|