diff --git a/docker-compose.env b/docker-compose.env index 36b5b44..f9c54dc 100644 --- a/docker-compose.env +++ b/docker-compose.env @@ -37,7 +37,6 @@ KEYDB_DBINDEX=0 KEYDB_PASSWORD='' KEYDB_POOL_SIZE=4 - # # S3 Object Storage # diff --git a/docker-compose.yml b/docker-compose.yml index 4598586..305e005 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,7 +21,7 @@ services: networks : - rack-network - # 2. KeyDB (Сессии, Сокеты, Очереди, Кэш чанков) + # 2. KeyDB keydb : image : eqalpha/keydb:latest container_name: rack_keydb @@ -53,7 +53,7 @@ services: - minio_data:/data command : server /data --console-address ":9001" - healthcheck : + healthcheck : test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 10s timeout: 5s @@ -63,25 +63,25 @@ services: networks : - rack-network - # 4. Авто-создатель бакетов + # 4. Авто-создатель бакетов minio-init: image : minio/mc:latest container_name: rack_minio_mc depends_on : minio: - condition: service_healthy + condition: service_healthy env_file : - .env entrypoint : > /bin/sh -c " echo 'Настройка подключения к MinIO...'; /usr/bin/mc alias set local http://minio:9000 ${rack_S3_ACCESS_KEY} ${rack_S3_SECRET_KEY}; - + echo 'Ожидание готовности сервера...'; while ! /usr/bin/mc ping local --count 1 > /dev/null 2>&1; do sleep 1; done; - + echo 'Сервер готов. Создание бакетов...'; /usr/bin/mc mb local/${rack_S3_BUCKET_PREFIX}-avatar --ignore-existing || true; /usr/bin/mc mb local/${rack_S3_BUCKET_PREFIX}-media --ignore-existing || true; diff --git a/net/xeaf/rack/core/views/view_set_create_mixin.py b/net/xeaf/rack/core/views/view_set_create_mixin.py index 727d977..b4a5e82 100644 --- a/net/xeaf/rack/core/views/view_set_create_mixin.py +++ b/net/xeaf/rack/core/views/view_set_create_mixin.py @@ -37,11 +37,11 @@ class ViewSetCreateMixin(CoreViewSet): create_response_serializer: Type[Serializer] | None = None """ Класс сериализатора для ответа на запрос о создании объекта """ - def item_create(self, request: Request, **kwargs: dict[str, Any]) -> CoreResponse: + def item_create(self, _request: Request, **kwargs: dict[str, Any]) -> CoreResponse: """ Обрабатывает HTTP запрос и возвращает ответ с новым объектом - :param request: Запрос + :param _request: Пропускаемый параметр запроса :param kwargs: Именованные аргументы :return: Ответ diff --git a/net/xeaf/rack/core/views/view_set_destroy_mixin.py b/net/xeaf/rack/core/views/view_set_destroy_mixin.py index 8e1097f..2595f7f 100644 --- a/net/xeaf/rack/core/views/view_set_destroy_mixin.py +++ b/net/xeaf/rack/core/views/view_set_destroy_mixin.py @@ -36,11 +36,11 @@ class ViewSetDestroyMixin(CoreViewSet): destroy_response_serializer: Type[Serializer] | None = None """ Класс сериализатора для ответа на запрос объекта """ - def item_destroy(self, request: Request, **kwargs: dict[str, Any]) -> CoreResponse: + def item_destroy(self, _request: Request, **kwargs: dict[str, Any]) -> CoreResponse: """ Обрабатывает HTTP запрос и возвращает ответ с объектом - :param request: Запрос + :param _request: Пропускаемый параметр запроса :param kwargs: Именованные аргументы :return: Ответ diff --git a/net/xeaf/rack/core/views/view_set_list_mixin.py b/net/xeaf/rack/core/views/view_set_list_mixin.py index fa8bfb8..47a08b6 100644 --- a/net/xeaf/rack/core/views/view_set_list_mixin.py +++ b/net/xeaf/rack/core/views/view_set_list_mixin.py @@ -33,11 +33,11 @@ class ViewSetListMixin(CoreViewSet): list_response_serializer: Type[Serializer] | None = None """ Класс сериализатора для ответа на запрос списка объектов """ - def item_list(self, request: Request, **kwargs: dict[str, Any]) -> CoreResponse: + def item_list(self, _request: Request, **kwargs: dict[str, Any]) -> CoreResponse: """ Обрабатывает HTTP запрос и возвращает ответ со списком объектов - :param request: Запрос + :param _request: Пропускаемый параметр запроса :param kwargs: Именованные аргументы :return: Ответ diff --git a/net/xeaf/rack/core/views/view_set_retrieve_mixin.py b/net/xeaf/rack/core/views/view_set_retrieve_mixin.py index 2426ae4..2637db1 100644 --- a/net/xeaf/rack/core/views/view_set_retrieve_mixin.py +++ b/net/xeaf/rack/core/views/view_set_retrieve_mixin.py @@ -34,11 +34,11 @@ class ViewSetRetrieveMixin(CoreViewSet): retrieve_response_serializer: Type[Serializer] | None = None """ Класс сериализатора для ответа на запрос объекта """ - def item_retrieve(self, request: Request, **kwargs: dict[str, Any]) -> CoreResponse: + def item_retrieve(self, _request: Request, **kwargs: dict[str, Any]) -> CoreResponse: """ Обрабатывает HTTP запрос и возвращает ответ с объектом - :param request: Запрос + :param _request: Пропускаемый параметр запроса :param kwargs: Именованные аргументы :return: Ответ diff --git a/net/xeaf/rack/core/views/view_set_update_mixin.py b/net/xeaf/rack/core/views/view_set_update_mixin.py index 800b4f7..6184e1f 100644 --- a/net/xeaf/rack/core/views/view_set_update_mixin.py +++ b/net/xeaf/rack/core/views/view_set_update_mixin.py @@ -37,11 +37,11 @@ class ViewSetUpdateMixin(CoreViewSet): update_response_serializer: Type[Serializer] | None = None """ Класс сериализатора для ответа на запрос на изменение объекта """ - def item_update(self, request: Request, **kwargs: dict[str, Any]) -> CoreResponse: + def item_update(self, _request: Request, **kwargs: dict[str, Any]) -> CoreResponse: """ Обрабатывает HTTP запрос и возвращает ответ с объектом - :param request: Запрос + :param _request: Пропускаемый параметр запроса :param kwargs: Именованные аргументы :return: Ответ diff --git a/net/xeaf/rack/serializers/__init__.py b/net/xeaf/rack/serializers/__init__.py index b33d7f1..f6b9f49 100644 --- a/net/xeaf/rack/serializers/__init__.py +++ b/net/xeaf/rack/serializers/__init__.py @@ -7,3 +7,5 @@ """ Пакет описания классов сериализаторов """ + +from .version_info_response import VersionInfoResponse diff --git a/net/xeaf/rack/utils/settings/setting_utils.py b/net/xeaf/rack/utils/settings/setting_utils.py index 68d6170..ffe343a 100644 --- a/net/xeaf/rack/utils/settings/setting_utils.py +++ b/net/xeaf/rack/utils/settings/setting_utils.py @@ -175,14 +175,20 @@ class SettingUtils: return data['project']['version'] @classmethod - def get_config_files(cls) -> list[str]: + def get_config_files(cls, extra: list[str] | None = None) -> list[str]: """ Возвращает список файлов конфигурации + :param extra: Дополнительные файлы конфигурации + :return: Список файлов конфигурации """ - return [file for file in cls.__config_files.values() if file is not None] + predefined_configs = [ + file for file in cls.__config_files.values() if file is not None + ] + + return predefined_configs + (extra if extra else []) @classmethod def set_config_file(cls, name: str, full_path: str | None) -> None: @@ -196,14 +202,16 @@ class SettingUtils: cls.__config_files[name] = full_path @classmethod - def get_installed_apps(cls) -> list[str]: + def get_installed_apps(cls, extra: list[str] | None = None) -> list[str]: """ Возвращает список установленных приложений + :param extra: Дополнительные приложения + :return: Список установленных приложений """ - return [ + predefined_apps = [ 'django.contrib.admin', 'django.contrib.admindocs', 'django.contrib.auth', @@ -216,6 +224,8 @@ class SettingUtils: 'net.xeaf.rack', ] + return predefined_apps + (extra if extra else []) + @classmethod def _check_initialization(cls) -> None: """ diff --git a/net/xeaf/rack/views/version_view_set.py b/net/xeaf/rack/views/version_view_set.py index 1a9285e..eda8021 100644 --- a/net/xeaf/rack/views/version_view_set.py +++ b/net/xeaf/rack/views/version_view_set.py @@ -16,7 +16,8 @@ from rest_framework.permissions import AllowAny from net.xeaf.rack.core import CoreModel from net.xeaf.rack.core.views import CoreViewSet from net.xeaf.rack.core.views import ViewSetRetrieveMixin -from net.xeaf.rack.serializers.version_info_response import VersionInfoResponse +from net.xeaf.rack.serializers import VersionInfoResponse +from net.xeaf.rack.utils.settings import SettingUtils class VersionViewSet(ViewSetRetrieveMixin, CoreViewSet): @@ -39,10 +40,9 @@ class VersionViewSet(ViewSetRetrieveMixin, CoreViewSet): """ version_info = { - "title": "DRF Rack", - "debug_mode": True, - "version": "0.1.0", - "build": "20230701", + "title": SettingUtils.get_app_name(), + "debug_mode": SettingUtils.is_debug_mode(), + "version": SettingUtils.get_app_version() } return version_info diff --git a/wsgiapp/asgi.py b/wsgiapp/asgi.py index 4ea59f5..283c1af 100644 --- a/wsgiapp/asgi.py +++ b/wsgiapp/asgi.py @@ -1,10 +1,11 @@ +# DRF Rack +# Библиотека классов расширений для Django REST Framework +# +# Автор: Николай В. Анохин +# Все права защищены. Лицензия: MIT + """ -ASGI config for wsgiapp project. - -It exposes the ASGI callable as a module-level variable named ``application``. - -For more information on this file, see -https://docs.djangoproject.com/en/6.0/howto/deployment/asgi/ +Запуск приложения ASGI """ import os @@ -12,5 +13,4 @@ import os from django.core.asgi import get_asgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'wsgiapp.settings') - application = get_asgi_application() diff --git a/wsgiapp/wsgi.py b/wsgiapp/wsgi.py index aac8c7f..901edeb 100644 --- a/wsgiapp/wsgi.py +++ b/wsgiapp/wsgi.py @@ -1,10 +1,11 @@ +# DRF Rack +# Библиотека классов расширений для Django REST Framework +# +# Автор: Николай В. Анохин +# Все права защищены. Лицензия: MIT + """ -WSGI config for wsgiapp project. - -It exposes the WSGI callable as a module-level variable named ``application``. - -For more information on this file, see -https://docs.djangoproject.com/en/6.0/howto/deployment/wsgi/ +Запуск приложения WSGI """ import os @@ -12,5 +13,4 @@ import os from django.core.wsgi import get_wsgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'wsgiapp.settings') - application = get_wsgi_application()