Skip to main content

Common utilities, settings, and contracts for Anet Microservices (Django/DRF)

Project description

Anet Common Library

Ushbu kutubxona Anet loyihasining mikroservislari uchun umumiy standartlar, sozlamalar va yordamchi vositalarni (utilities) o'z ichiga oladi.

O'rnatish

pip install anet-common

(Yoki private repodan o'rnatish)

Eslatma: drf-spectacular[sidecar] allaqachon dependency sifatida kiritilgan. Swagger UI va ReDoc statik fayllari CDN o'rniga lokal paketdan yuklanadi — tashqi internet mavjud bo'lmagan dev tarmoqlarda ham ishlaydi.


Foydalanish

Mikroservisning settings.py faylida ushbu kutubxonadan standart konfiguratsiyalarni import qiling va ularni kengaytiring (extend).

settings.py namunasi:

from anet_common.conf import (
    COMMON_LANGUAGES,
    COMMON_MODELTRANSLATION_LANGUAGES,
    COMMON_REST_FRAMEWORK,
    COMMON_SPECTACULAR_SETTINGS,
    COMMON_SPECTACULAR_APPS,
)

# INSTALLED APPS
INSTALLED_APPS = [
    "modeltranslation",
    # ...
    "rest_framework",
    # ...
] + COMMON_SPECTACULAR_APPS
# COMMON_SPECTACULAR_APPS = ["drf_spectacular", "drf_spectacular_sidecar"]

# 1. MIDDLEWARE
MIDDLEWARE = [
    "anet_common.middleware.RequestIdMiddleware",  # Eng yuqorida tursin
    "django.middleware.locale.LocaleMiddleware",
    # ... boshqa middlewarelar
]

# 2. TILLAR VA VAQT
TIME_ZONE = "Asia/Tashkent"
LANGUAGE_CODE = "uz"
LANGUAGES = COMMON_LANGUAGES
# Natija: (('uz', "O'zbek"), ('ru', "Русский"), ('en', "English"))

MODELTRANSLATION_LANGUAGES = COMMON_MODELTRANSLATION_LANGUAGES
MODELTRANSLATION_DEFAULT_LANGUAGE = "uz"

# 3. DRF SOZLAMALARI
REST_FRAMEWORK = COMMON_REST_FRAMEWORK.copy()
REST_FRAMEWORK.update({
    # Loyihaga xos qo'shimchalar
    "DEFAULT_PERMISSION_CLASSES": (
        "rest_framework.permissions.IsAuthenticated",
    ),
})

# 4. SPECTACULAR (SWAGGER) SOZLAMALARI
# SWAGGER_UI_DIST va REDOC_DIST = "SIDECAR" allaqachon o'rnatilgan:
# statik fayllar CDN o'rniga drf_spectacular_sidecar paketidan yuklanadi.
SPECTACULAR_SETTINGS = COMMON_SPECTACULAR_SETTINGS.copy()
SPECTACULAR_SETTINGS.update({
    "TITLE": "Mening Mikroservis API",
    "DESCRIPTION": "Bu servis faqat ... uchun javob beradi",
    "VERSION": "1.0.0",
})

# 5. SERVIS MA'LUMOTLARI (Meta uchun)
SERVICE_NAME = "my-service"
SERVICE_VERSION = "v1"

urls.py namunasi:

from django.urls import path, include
from anet_common.spectacular.urls import urlpatterns as spectacular_urls

urlpatterns = [
    # Spectacular (Swagger UI + ReDoc) — lokal sidecar statikasidan
    path("api/", include(spectacular_urls)),
    # Natija:
    #   GET /api/schema/            — OpenAPI JSON/YAML schema
    #   GET /api/schema/swagger-ui/ — Swagger UI
    #   GET /api/schema/redoc/      — ReDoc

    # ... boshqa url'lar
]

Swagger UI va ReDoc uchun URL prefix ("api/") loyihaga qarab o'zgartirish mumkin.

Statik fayllarni yig'ish

drf_spectacular_sidecar statik fayllarni paket ichida saqlaydi. Deployment oldidan odatdagi collectstatic buyrug'i yetarli:

python manage.py collectstatic --noinput

views.py da pagination namunasi:

class TestAPIView(generics.APIView):  # or GenericAPIView
    queryset = MyObject.objects.all()
    serializer_class = MyObjectSerializer

    def get(self, request):
        qs = self.get_queryset()

        # 1. Querysetni sahifalash
        page = self.paginate_queryset(qs)

        # 2. Agar sahifalash muvaffaqiyatli bo'lsa
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(qs, many=True)
        return Response(serializer.data)

Tarkibi va Konstantalar

1. COMMON_LANGUAGES

Loyiha qo'llab-quvvatlaydigan 3 ta asosiy til:

  • uz: O'zbek
  • ru: Rus
  • en: Ingliz

Umumiy COMMON_ qiymatlarining tarkibi

from django.utils.translation import gettext_lazy as _

# 1. COMMON LANGUAGES
COMMON_LANGUAGES = (
    ("uz", "O'zbek"),
    ("ru", "Русский"),
    ("en", "English"),
)

COMMON_MODELTRANSLATION_LANGUAGES = ("uz", "ru", "en")
COMMON_MODELTRANSLATION_DEFAULT_LANGUAGE = "uz"

# 2. COMMON REST FRAMEWORK SETTINGS
COMMON_REST_FRAMEWORK = {
    "DEFAULT_RENDERER_CLASSES": (
        "anet_common.drf.renderers.AnetJSONRenderer",
    ),
    "DEFAULT_PARSER_CLASSES": (
        "djangorestframework_camel_case.parser.CamelCaseJSONParser",
        "rest_framework.parsers.JSONParser",
        "rest_framework.parsers.FormParser",
        "rest_framework.parsers.MultiPartParser",
    ),
    "EXCEPTION_HANDLER": "anet_common.drf.exceptions.custom_exception_handler",
    "DEFAULT_PAGINATION_CLASS": "anet_common.drf.pagination.StandardPageNumberPagination",
    "PAGE_SIZE": 20,
    "DEFAULT_SCHEMA_CLASS": "anet_common.spectacular.schema.StandardAutoSchema",
    "TEST_REQUEST_DEFAULT_FORMAT": "json",
}

# 3. COMMON SPECTACULAR SETTINGS
# SWAGGER_UI_DIST, SWAGGER_UI_FAVICON_HREF, REDOC_DIST = "SIDECAR"
# => statik fayllar CDN o'rniga drf_spectacular_sidecar dan yuklanadi
COMMON_SPECTACULAR_SETTINGS = {
    "SERVE_INCLUDE_SCHEMA": False,
    "COMPONENT_SPLIT_REQUEST": True,
    "COMPONENT_NO_READ_ONLY_REQUIRED": True,
    "POSTPROCESSING_HOOKS": [
        "drf_spectacular.hooks.postprocess_schema_enums",
    ],
    "SWAGGER_UI_DIST": "SIDECAR",
    "SWAGGER_UI_FAVICON_HREF": "SIDECAR",
    "REDOC_DIST": "SIDECAR",
}

# 4. SPECTACULAR UCHUN ZARUR INSTALLED_APPS
COMMON_SPECTACULAR_APPS = [
    "drf_spectacular",
    "drf_spectacular_sidecar",
]

2. COMMON_REST_FRAMEWORK

Quyidagi standart sozlamalarni o'z ichiga oladi:

  • Renderer: AnetJSONRenderer — javoblarni standart formatga o'tkazadi.
  • Parser: CamelCaseJSONParser va standart parserlar.
  • Exception Handler: custom_exception_handler — xatolarni katalogdan olib, yagona formatga o'tkazadi.
  • Pagination: StandardPageNumberPagination (default page_size=20).

4. meta.timing — So'rov vaqti

Har bir javobda meta.timing maydoni avtomatik to'ldiriladi. Buning uchun RequestIdMiddleware MIDDLEWARE ro'yxatida eng yuqorida turishi shart.

Maydon Ta'rif
total_ms So'rov kelgandan JSON render tugagunga qadar to'liq vaqt
breakdown.app_ms Middleware + view logikasi + ORM + serializer vaqti
breakdown.renderer_ms Faqat JSON render qilish vaqti

Eslatma: timing maydoni faqat RequestIdMiddleware o'rnatilgan bo'lsa to'ldiriladi. Middleware mavjud bo'lmasa, timing meta ichida ko'rinmaydi.

3. Response Formati

A. Success — List (Pagination bilan)

{
  "success": true,
  "status_code": 200,
  "data": [
    {"id": 1, "name": "Acme LLC"},
    {"id": 2, "name": "Beta LLC"}
  ],
  "errors": [],
  "meta": {
    "request_id": "550e8400-e29b-41d4-a716-446655440000",
    "timestamp": "2026-01-21T10:15:30.123456+05:00",
    "service": "company-service",
    "version": "v1",
    "language": "uz",
    "pagination": {
      "page": 1,
      "page_size": 20,
      "total_items": 120,
      "total_pages": 6,
      "has_next": true,
      "has_prev": false
    },
    "timing": {
      "total_ms": 47.83,
      "breakdown": {
        "app_ms": 46.30,
        "renderer_ms": 1.53
      }
    }
  }
}

B. Success — Detail (Single Object)

{
  "success": true,
  "status_code": 200,
  "data": {
    "id": 1,
    "name": "Acme LLC"
  },
  "errors": [],
  "meta": {
    "request_id": "550e8400-e29b-41d4-a716-446655440000",
    "timestamp": "2026-01-21T10:15:30.123456+05:00",
    "service": "company-service",
    "version": "v1",
    "language": "uz",
    "timing": {
      "total_ms": 12.41,
      "breakdown": {
        "app_ms": 10.88,
        "renderer_ms": 1.53
      }
    }
  }
}

C. Error Response

Xatoliklar har doim errors ro'yxati ichida qaytadi. data null bo'ladi. details: raise MyException(extra_details={...}) deb chaqirilsa to'ldiriladi.

{
  "success": false,
  "status_code": 404,
  "data": null,
  "errors": [
    {
      "code": "VAL-0001",
      "message": "Topilmadi",
      "detail_message": "No BookingItem matches the given query.",
      "field": "email",
      "source": null,
      "details": null
    }
  ],
  "meta": {
    "request_id": "550e8400-e29b-41d4-a716-446655440000",
    "timestamp": "2026-01-21T10:15:30.123456+05:00",
    "service": "auth-service",
    "version": "v1",
    "language": "uz",
    "timing": {
      "total_ms": 8.17,
      "breakdown": {
        "app_ms": 6.94,
        "renderer_ms": 1.23
      }
    }
  }
}

Xatoliklar Katalogi

Xatoliklar markazlashgan JSON katalogi orqali boshqariladi. Yangi xatolik qo'shish uchun kutubxona yangilanishi kerak.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

anet_common-0.1.7.tar.gz (14.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

anet_common-0.1.7-py3-none-any.whl (13.4 kB view details)

Uploaded Python 3

File details

Details for the file anet_common-0.1.7.tar.gz.

File metadata

  • Download URL: anet_common-0.1.7.tar.gz
  • Upload date:
  • Size: 14.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for anet_common-0.1.7.tar.gz
Algorithm Hash digest
SHA256 dae73bf09a3d3db5ea69901f1f2509b3feb34d55bdd2cf547b197503020c96b3
MD5 9811590eabc23170470a883e9c7b6eb8
BLAKE2b-256 b73d4890ccaeed6c1990cbbf8b28d678a5f5a18002825de9ac7a739672ff2232

See more details on using hashes here.

File details

Details for the file anet_common-0.1.7-py3-none-any.whl.

File metadata

  • Download URL: anet_common-0.1.7-py3-none-any.whl
  • Upload date:
  • Size: 13.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for anet_common-0.1.7-py3-none-any.whl
Algorithm Hash digest
SHA256 a088c7695366e220a197bdd935ca4ddb5fc35c4e2cc2da1b5188ebe6b87f3c3a
MD5 b25bb6d667a3a2b5ddf249b2696d6150
BLAKE2b-256 57f0a3f85b74bbeb696a744a2e7f0baf12250026b59b240e5fc484b53a393975

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page