From a6c9db1a71d7249736a4ff8457d0f20a17e288f6 Mon Sep 17 00:00:00 2001 From: "Nick V. Anokhin" Date: Sun, 19 Jul 2026 19:45:03 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B2=D0=BE=D0=B9=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../middleware/custom_exception_handler.py | 20 +----- .../middleware/custom_logging_middleware.py | 11 +-- net/xeaf/rack/models/journal_model.py | 67 +++++++++++++++++++ net/xeaf/rack/models/session_model.py | 2 +- .../rack/utils/settings/configs/logging.py | 2 +- net/xeaf/rack/views/version_view_set.py | 2 + 6 files changed, 80 insertions(+), 24 deletions(-) create mode 100644 net/xeaf/rack/models/journal_model.py diff --git a/net/xeaf/rack/middleware/custom_exception_handler.py b/net/xeaf/rack/middleware/custom_exception_handler.py index 561f285..8959d3f 100644 --- a/net/xeaf/rack/middleware/custom_exception_handler.py +++ b/net/xeaf/rack/middleware/custom_exception_handler.py @@ -8,8 +8,6 @@ Описание функции custom_exception_handler """ -import logging - from rest_framework import status from rest_framework.exceptions import MethodNotAllowed from rest_framework.exceptions import NotAuthenticated @@ -23,7 +21,6 @@ from net.xeaf.rack.models.responses import ErrorResponse from net.xeaf.rack.utils.exceptions import ForbiddenException from net.xeaf.rack.utils.exceptions import NotFoundException from net.xeaf.rack.utils.exceptions import UnauthorizedException -from wsgiapp import settings def custom_exception_handler(exc: CoreException | Exception, context: dict) -> Response: @@ -134,17 +131,6 @@ def _make_error_response(status_code: int, detail: list | dict | str | bool | No :return: Ответ """ - logger = logging.getLogger(settings.LOGGER_NAME) - - if status_code == status.HTTP_400_BAD_REQUEST: - logger.debug(str(exc_info), exc_info=exc_info) - elif status_code == status.HTTP_401_UNAUTHORIZED: - logger.warning(str(exc_info), exc_info=exc_info) - elif status_code == status.HTTP_403_FORBIDDEN: - logger.warning(str(exc_info), exc_info=exc_info) - elif status_code == status.HTTP_404_NOT_FOUND: - logger.error(str(exc_info), exc_info=exc_info) - else: - logger.critical(str(exc_info), exc_info=exc_info) - - return ErrorResponse(status_code=status_code, detail=detail, meta=meta, pure_status=pure_status) + result = ErrorResponse(status_code=status_code, detail=detail, meta=meta, pure_status=pure_status) + result._raised_exception = exc_info + return result diff --git a/net/xeaf/rack/middleware/custom_logging_middleware.py b/net/xeaf/rack/middleware/custom_logging_middleware.py index 1e9fa85..14a3567 100644 --- a/net/xeaf/rack/middleware/custom_logging_middleware.py +++ b/net/xeaf/rack/middleware/custom_logging_middleware.py @@ -63,7 +63,7 @@ class CustomLoggingMiddleware: # Обрабатываем данные запроса, ответа и перехваченного исключения body = self._process_body(request) - exc = getattr(request, "_raised_exception", None) + exc = getattr(response, "_raised_exception", None) status_code = response.status_code request_id = request.META.get('HTTP_X_REQUEST_ID', '') response_content = self._process_response(response) @@ -172,18 +172,19 @@ class CustomLoggingMiddleware: :param exc: Исключение """ - if exc: - - log_message += f"\nException: {str(exc)}" + if exc or status_code >= status.HTTP_400_BAD_REQUEST: if status_code == status.HTTP_400_BAD_REQUEST: self.logger.debug(log_message, exc_info=exc) - elif status_code in [status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN]: # UNAUTHORIZED, FORBIDDEN + elif status_code == status.HTTP_401_UNAUTHORIZED: + self.logger.warning(log_message, exc_info=exc) + elif status_code == status.HTTP_403_FORBIDDEN: self.logger.warning(log_message, exc_info=exc) elif status_code == status.HTTP_404_NOT_FOUND: self.logger.error(log_message, exc_info=exc) else: self.logger.critical(log_message, exc_info=exc) + else: self.logger.debug(log_message) diff --git a/net/xeaf/rack/models/journal_model.py b/net/xeaf/rack/models/journal_model.py new file mode 100644 index 0000000..644fbca --- /dev/null +++ b/net/xeaf/rack/models/journal_model.py @@ -0,0 +1,67 @@ +# DRF Rack +# Библиотека классов расширений для Django REST Framework +# +# Автор: Николай В. Анохин +# Все права защищены. Лицензия: MIT + +""" +Описание класса Session +""" + +from django.conf import settings +from django.db import models +from django.utils.translation import gettext_lazy as _ + +from net.xeaf.rack.core import CoreModel +from net.xeaf.rack.models.mixins import CreatedAtMixin + + +class JournalModel(CoreModel, CreatedAtMixin): + """ + Модель журнала работы пользователей + """ + + account = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + null=False, + blank=False, + related_name="fk_journal_model_account", + verbose_name=_("rack.models.account"), + ) + """ Аккаунт пользователя """ + + actual_account = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + null=False, + blank=False, + related_name="fk_journal_model_actual_account", + verbose_name=_("rack.models.session_model.actual_account"), + ) + """ Актуальный аккаунт пользователя """ + + action = models.CharField( + max_length=36, + null=False, + blank=False, + verbose_name=_("rack.models.journal_model.action"), + ) + """ Действие """ + + + + class Meta: + """ + Параметры конфигурации класса + """ + # Индексы для производительности + indexes = [ + models.Index(fields=["account"]), + models.Index(fields=["actual_account"]), + ] + + # Данные таблицы + db_table = "rack_journal" + verbose_name = _("rack.models.journal") + verbose_name_plural = _("rack.models.journal_plural") diff --git a/net/xeaf/rack/models/session_model.py b/net/xeaf/rack/models/session_model.py index 81b2f9c..7c6a201 100644 --- a/net/xeaf/rack/models/session_model.py +++ b/net/xeaf/rack/models/session_model.py @@ -38,7 +38,7 @@ class SessionModel(CoreModel, CreatedAtMixin, ExpiresAtMixin): on_delete=models.CASCADE, null=False, blank=False, - verbose_name=_("rack.models.session_model.account"), + verbose_name=_("rack.models.account"), ) """ Аккаунт пользователя """ diff --git a/net/xeaf/rack/utils/settings/configs/logging.py b/net/xeaf/rack/utils/settings/configs/logging.py index 53426b1..60b3273 100644 --- a/net/xeaf/rack/utils/settings/configs/logging.py +++ b/net/xeaf/rack/utils/settings/configs/logging.py @@ -53,7 +53,7 @@ LOGGING = { "formatters": { "custom_format": { - "format": "{asctime} [{levelname}] {message}", + "format": "\n{asctime} [{levelname}] {message}", "datefmt": "%Y-%m-%d %H:%M:%S", "style": "{", }, diff --git a/net/xeaf/rack/views/version_view_set.py b/net/xeaf/rack/views/version_view_set.py index eda8021..af1e2dd 100644 --- a/net/xeaf/rack/views/version_view_set.py +++ b/net/xeaf/rack/views/version_view_set.py @@ -45,6 +45,8 @@ class VersionViewSet(ViewSetRetrieveMixin, CoreViewSet): "version": SettingUtils.get_app_version() } + z = 1 / 0 + return version_info @classmethod