Asosiy kontentga o‘tish

Maqolalar

Darslik · 2026-08-17 · ~5 daqiqa o‘qiladi · boshlang'ich

DRF'da avtomatik Swagger: hujjat kodning o'zidan tug'iladi

#python #django #drf #api

Mundarija

API yozayotgan odamning ishi endpoint bilan tugamaydi — uni kimdir ishlatishi kerak: mobil jamoa, frontendchi, ba'zan olti oydan keyingi o'zingiz. Va shu yerda abadiy savollar boshlanadi: qanday endpoint'lar bor, qaysi maydonlar majburiy, javob qanday ko'rinishda keladi. Buni qo'lda yozilgan hujjat bilan yechish mumkin, lekin qo'lda yozilgan hujjatning taqdiri ma'lum — u ikkinchi haftadayoq koddan orqada qoladi.

Netflix-uslub API loyihamda boshqa yo'lni tanlaganman va o'shandan beri hamma DRF loyihada shu turadi: hujjat kodning o'zidan yasaladi. Serializer'lar, view'lar, permission'lar allaqachon hamma ma'lumotni o'z ichida saqlaydi — uni chiroyli sahifaga aylantirib beradigan asbob esa drf-spectacular.

Sozlash: uch qadam#

uv add drf-spectacular
# config/settings.py
INSTALLED_APPS = [
    # ...
    "rest_framework",
    "drf_spectacular",
]

REST_FRAMEWORK = {
    # DRF'ga sxemani kim yasashini aytamiz
    "DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
}

SPECTACULAR_SETTINGS = {
    "TITLE": "Movies API",
    "DESCRIPTION": "Video-kontent katalogi: filmlar, janrlar, reytinglar.",
    "VERSION": "1.0.0",
    # hujjat sahifasining o'zida sxema fayli ko'rinmasin — toza UI
    "SERVE_INCLUDE_SCHEMA": False,
}
# config/urls.py
from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView

urlpatterns = [
    # ...
    # xom sxema (OpenAPI JSON/YAML) — asboblar shuni o'qiydi
    path("api/schema/", SpectacularAPIView.as_view(), name="schema"),
    # odamlar uchun interaktiv sahifa
    path("api/docs/", SpectacularSwaggerView.as_view(url_name="schema")),
]

Shu uch qadam bo'ldi. Brauzerda /api/docs/ ni oching — barcha endpoint'laringiz, maydonlari va tiplari bilan ro'yxat bo'lib turibdi, har birini "Try it out" tugmasi bilan shu yerning o'zida sinab ko'rsa bo'ladi. Postman kolleksiyasini qo'lda yig'ib yurish shart emas.

Hujjat sifatini kod sifati belgilaydi#

Muhim tushuncha: drf-spectacular hech narsani "o'ylab topmaydi", u kodda borini ko'rsatadi. Demak hujjatni yaxshilashning yo'li ham kodni boyitishdan o'tadi. Uch odat katta farq qiladi.

Birinchisi — serializer maydonlariga help_text:

# apps/movies/serializers.py
class MovieSerializer(serializers.ModelSerializer):
    class Meta:
        model = Movie
        fields = ["id", "title", "year", "rating", "genre"]
        extra_kwargs = {
            "rating": {"help_text": "0 dan 10 gacha, bir xona aniqlikda"},
            "year": {"help_text": "Chiqarilgan yili, masalan 2019"},
        }

Bu matnlar Swagger sahifasida maydon tavsifi bo'lib chiqadi — va Django admin'da ham ko'rinadi, bir mehnatga ikki foyda.

Ikkinchisi — alohida holatlarni extend_schema bilan izohlash. Standart CRUD o'zi tushunarli chiqadi, lekin maxsus action'larga izoh kerak bo'ladi:

# apps/movies/views.py
from drf_spectacular.utils import extend_schema


class MovieViewSet(viewsets.ModelViewSet):
    queryset = Movie.objects.all()
    serializer_class = MovieSerializer

    @extend_schema(
        summary="Tavsiya etilgan filmlar",
        description="Foydalanuvchi reytinglariga qarab 10 ta film qaytaradi. "
        "Ro'yxat har soatda qayta hisoblanadi.",
        responses=MovieSerializer(many=True),
    )
    @action(detail=False)
    def recommended(self, request): ...

Uchinchisi — docstring odatlari: view klassining docstring'i ham sxemaga tushadi. Ya'ni kod o'qigan hamkasbingiz uchun yozgan izohingiz frontend jamoasi uchun hujjat bo'lib ham xizmat qiladi.

Sxemani CI'da tekshiring

Sxema koddan yasalgani uchun uni buzish ham kod bilan bo'ladi — masalan nomsiz ikkita serializer to'qnashsa, spectacular ogohlantirish beradi. Bitta buyruq bor: python manage.py spectacular --validate --file /dev/nullCI zanjiringizga shu qadamni qo'shib qo'ysangiz, hujjat buzilgan holatda deploy o'tmaydi.

Kimga ochiq bo'lishi kerak?#

Bitta savolni ochiq muhokama qilgan ma'qul: hujjat sahifasi hammaga ko'rinsinmi? Ochiq, ommaviy API bo'lsa — albatta. Ichki loyihada esa /api/docs/ sahifasi API'ingizning to'liq xaritasi ekanini unutmang — begona ko'z uchun bu qimmatli razvedka. Bunday holatda sahifani login ortiga olib qo'ying:

# config/urls.py — faqat kirgan foydalanuvchilarga
from django.contrib.admin.views.decorators import staff_member_required

urlpatterns += [
    path("api/docs/", staff_member_required(SpectacularSwaggerView.as_view(url_name="schema"))),
]

Yakun#

Uchta URL va bitta sozlama bloki evaziga API'ingiz o'zini o'zi hujjatlaydigan bo'ldi: kod o'zgardi — hujjat o'zgardi, orada hech kim hech narsani qo'lda yangilamaydi. Sifatni oshirish ham tanish ishlar orqali: help_text, docstring, extend_schema. Hujjat endi alohida yuk emas, kod yozish odatining bir qismi.

Keyingi — juftlikning ikkinchi qismi: filtrlash va pagination — ro'yxat endpoint'ini «hammasini qaytaradigan»dan «keraklisini qaytaradigan»ga aylantirish.