Asosiy kontentga o‘tish

Maqolalar 5 daqiqa 183 ko‘rish

FastAPI yoki Django REST Framework: qaysi birini tanlash

Python'da API yozishni boshlaganingizda birinchi to‘xtaladigan savolingiz — qaysi tool'da yozaman. Ikkalasida ham bir xil endpoint yozib, farqini o‘z ko‘zingiz bilan ko‘ramiz va qaysi biri qaysi loyihaga mos kelishini aniqlaymiz.

api python backend

Mundarija

Python'da API yozishni boshlaganingizda birinchi to‘xtaladigan savolingiz odatda bitta bo‘ladi: buni qaysi tool'da yozsam? Ikkita mashhur javob bor — FastAPI va Django REST Framework. Internetda "qaysi biri yaxshiroq" degan bahslar ko‘p, lekin rostini aytsam, bu savolning to‘g‘ri javobi yo‘q. To‘g‘rirog‘i, javob loyihangizga bog‘liq. Farqni his qilish uchun ikkalasida ham post yaratadigan endpoint yozib ko‘ramiz — qiziq joyi shundaki, deyarli bir xil uzunlikdagi kod ikki tomonda butunlay boshqa hajmdagi ishni bajaradi.

Django REST Framework#

DRF yakka o‘zi yashamaydi, u Django'ning bir qismi. Va aynan shu uning eng katta kuchi. Agar loyihangizda baza, foydalanuvchilar, admin panel kabi narsalar allaqachon bor bo‘lsa yoki kerak bo‘ladigan bo‘lsa, DRF ularning ustiga tabiiy o‘tiradi:

Python
from rest_framework import serializers, viewsets


class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ["id", "title", "body"]


class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

Bu bir necha qatorning ortida ancha ko‘p ish yashiringan. Router'ga ulab qo‘yganingizda nima chiqishini ko‘raylik:

Natija
POST   /api/posts/   -> 201 {"id":1,"title":"Salom","body":"matn"}
GET    /api/posts/   -> 200 [{"id":1,"title":"Salom","body":"matn"}]
PATCH  /api/posts/1/ -> 200 {"id":1,"title":"Yangi","body":"matn"}
DELETE /api/posts/1/ -> 204

Ya'ni o‘n uch qator kod postlarni ko‘rsatadi, yangisini yaratadi, tahrirlaydi va o‘chiradi — to‘liq CRUD, hammasi bazaga yozilgan holda. Kelgan ma'lumot ham tekshiriladi: body ni yubormasangiz, 400 {"body":["This field is required."]} javobi keladi. Ustiga Django'ning admin paneli, foydalanuvchilar va ruxsatlar tizimi ham qo‘lingizda turadi.

Halol bo‘lish uchun aytib qo‘yay: bu o‘n uch qator yakka o‘zi ishlamaydi. Ular ishlashi uchun Post modeli, unga migratsiya, INSTALLED_APPS ga rest_framework va ilovaning o‘zi, hamda urls.py da router kerak. Ya'ni DRF sizdan avval Django loyihasini talab qiladi — buning evaziga esa ustiga qo‘shilgan har bir narsa tayyor holda keladi.

FastAPI#

FastAPI boshqacha ishlaydi. U yengil, asinxron va Python'ning tip belgilariga suyanadi. Kelgan ma'lumotni tekshirish ham, hujjat yasash ham deyarli o‘z-o‘zidan bo‘ladi:

Python
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Post(BaseModel):
    title: str
    body: str


@app.post("/posts/")
async def create_post(post: Post):
    return {"ok": True, "title": post.title}

Bu ikki buyruq bilan ishga tushadi:

Terminal
uv add "fastapi[standard]"
fastapi dev main.py
Natija
 🌐 Server started at http://127.0.0.1:8000
    Documentation at http://127.0.0.1:8000/docs

O‘sha /docs manzilini ochsangiz, interaktiv hujjat allaqachon o‘zi tayyor turganini ko‘rasiz — hech narsa qo‘shmadingiz, u tip belgilaridan yasaldi. Ma'lumot tekshiruvi ham shu yerdan keladi: body ni yubormasangiz, 422 bilan Field required javobi qaytadi.

Bu yerda ham kod kam, lekin sabab boshqacha. Yuqoridagi o‘n uch qator hech narsaga tayanmaydi — lekin u bitta endpoint'dan iboratki, u hatto hech qayerga saqlamaydi ham. Baza ham, admin ham, foydalanuvchilar ham framework bilan birga kelmaydi; ro‘yxat, tahrirlash va o‘chirishni ham o‘zingiz yozasiz. Kerakli qismini o‘zingiz tanlab qo‘shasiz — erkinlik ham, mas'uliyat ham shunda.

Endi tanlovga kelsak#

Farqni sezdingiz: teng uzunlikdagi ikki namunadan biri to‘liq CRUD'ni bazaga ulab beradi, ikkinchisi esa bitta endpoint bilan cheklanadi — lekin birinchisi buning uchun butun Django loyihasini talab qiladi, ikkinchisiga esa bitta fayl yetadi. Qaysi birini tanlash shu muvozanatga bog‘liq.

Hujjat masalasida ham shunday: FastAPI'da /docs o‘z-o‘zidan keladi, DRF'da esa uni drf-spectacular kabi paket qo‘shib olasiz — qiyin emas, lekin bu ham bitta qo‘shimcha qadam.

Agar siz to‘liq web-ilova qurayotgan bo‘lsangiz — baza, admin panel, foydalanuvchilar bilan — DRF ko‘p ishni siz uchun qilib beradi va vaqtingizni tejaydi. Katta jamoada ham DRF qulay, chunki uning yozish uslublari yaxshi o‘rnashib qolgan, har kim bir xilda yozadi va bir-birining kodini oson tushunadi.

FastAPI esa alohida, kichik xizmat yozayotganingizda o‘zini ko‘rsatadi. "Tezroq" degan gapni biroz aniqlashtirib qo‘yay, chunki uni ko‘pincha haddan tashqari keng tushunishadi: FastAPI'ning ustunligi — asinxronlik tug‘maligi, ya'ni xizmat vaqtining katta qismini boshqa xizmatlar javobini kutib o‘tkazganda seziladi. Django'da ham asinxron view'lar bor, lekin ORM o‘sha darajada asinxron emas, shuning uchun ko‘p so‘rovni parallel kutish kerak bo‘lgan joyda FastAPI qulayroq chiqadi. Oddiy CRUD'da esa farq foydalanuvchiga bilinmaydi. Tez sinab ko‘riladigan kichik loyihalarda ham u qulay, chunki ortiqcha narsa bilan ovora qilmaydi.

Amalda esa ko‘pchilik bu savolni "yo u, yo bu" deb bir marta hal qilib qo‘ymaydi — tanlov loyihadan loyihaga o‘zgaradi. Menda ham shunday: mobil ilovaga xizmat qiladigan Metro API'ni DRF'da yozganman, shifokorga yozilish tizimini esa FastAPI'da. Ikkalasi ham o‘z joyida to‘g‘ri tanlov bo‘lgan. Shuning uchun buni "qaysi biri kuchli" degan bahsga aylantirishning hojati yo‘q — ikkalasi ham kuchli, gap faqat qaysi biri sizning ishingizga ko‘proq mosligida.

5 daqiqa 183 marta o‘qildi