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.
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:
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:
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:
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:
uv add "fastapi[standard]"
fastapi dev main.py
🌐 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.