AXV

Pagination va Throttling

Katta hajmdagi ma'lumotlarni sahifalash va API-ni ortiqcha yuklamalardan himoyalash

10-sinfAdvanced Python Back-end3-hafta · 7-dars

Dars rejasi

Pagination Zarurati

Server xotirasini tejash va PageNumberPagination orqali ma'lumotlarni bo'lib berish.

Throttling Himoyasi

Rate limiting, DoS va brute-force hujumlarini to'xtatish, 429 status kodi.

Sozlash va Testlash

apps/common/pagination.py va accounts/throttles.py amaliyotlari.

01

Pagination mexanizmi

Katta hajmdagi ma'lumotlarni bo'laklab uzatish

Nega Pagination shart?

50 000 ta postni birdaniga yuklash xavfi

Paginatsiyasiz (50 000 post) JSON hajmi: ~80 MB Server RAM to'ladi, DB sekinlashadi Mobil trafik 1 daqiqada tugaydi Brauzer qotib qoladi (Crash) Paginatsiya bilan (10 tadan) JSON hajmi: ~15 KB (Yengil!) Server yuki minimal (LIMIT 10 OFFSET 0) Sahifa 50 ms da bir zumda ochiladi Foydalanuvchi tajribasi a'lo

Pagination JSON strukturasi

DRF qaytaradigan 4 ta asosiy qatlam

"count" 57 ta Barcha postlar soni "next" ?page=2 Keyingi sahifa havolasi "previous" null / ?page=1 Oldingi sahifa havolasi "results" [ {...}, {...} ] 10 ta maqola ro'yxati

src/apps/common/pagination.py

from rest_framework.pagination import PageNumberPagination

class DefaultPageNumberPagination(PageNumberPagination):
    page_size = 10
    page_size_query_param = "page_size"
    max_page_size = 100
max_page_size = 100 parametri xaker ataylab ?page_size=1000000 deb serverni qotirib qo'yishining oldini oladi.
02

Throttling (Rate Limiting)

So'rovlar oqimini cheklash va serverni himoya qilish

Throttling qanday ishlaydi?

Ortiqcha so'rovlar darhol 429 Too Many Requests bilan to'xtatiladi

Kiberbot / So'rovlar 70 ta so'rov / daqiqa Limit: 60/min DRF Throttling Keshda IP hisoblanadi 1..60: 200 OK → O'tadi 61+: To'xtatiladi! 429 Status Too Many Requests Retry-After: 60s

DRF dagi asosiy Throttle klasslari

AnonRateThrottle

Tizimga kirmagan mehmonlar uchun (IP bo'yicha hisoblaydi, masalan: 60/min).

UserRateThrottle

Ro'yxatdan o'tgan foydalanuvchilar uchun (User ID bo'yicha, masalan: 300/min).

ScopedRateThrottle

Alohida nozik endpointlar uchun (masalan, login uchun qat'iy: 10/min).

settings/base.py sozlamalari

REST_FRAMEWORK = {
    # Global Pagination
    "DEFAULT_PAGINATION_CLASS": 
        "apps.common.pagination.DefaultPageNumberPagination",
    "PAGE_SIZE": 10,

    # Global Throttling
    "DEFAULT_THROTTLE_CLASSES": (
        "rest_framework.throttling.AnonRateThrottle",
        "rest_framework.throttling.UserRateThrottle",
    ),
    "DEFAULT_THROTTLE_RATES": {
        "anon": "60/min",
        "user": "300/min",
        "login_anon": "10/min",
    },
}

Throttling qanday tekshiriladi?

1-qadam: Oddiy so'rovlar

Brauzerda GET /api/v1/posts/ chaqiriladi — server xotirasida soniya hisoblagich boshlanadi.

2-qadam: Limitga yetish

1 daqiqa ichida so'rovlar soni 60 taga yetganda, kesh chegarasi to'ladi.

3-qadam: 429 Blokirovkasi

61-so'rovdan boshlab {"detail": "Request was throttled. Expected available in 55 seconds."} qaytadi.

Atamalarni eslab qolamiz

Pagination

Bosing va tekshiring

Sahifalash

Katta ma'lumotlarni server xotirasini qiynamasdan bo'lib berish.

Throttling

Bosing va tekshiring

Tezlik chegarasi

Daqiqasiga keladigan so'rovlar sonini me'yorga solish va botlardan himoya.

429 Status

Bosing va tekshiring

Juda ko'p so'rov

Limitdan oshganda qaytariladigan "Iltimos, biroz kuting" xabari.

Tezkor bilim tekshiruvi

Nima uchun pagination sozlamasida max_page_size berilishi shart?

To'g'ri! Agar maksimal hajm cheklanmasa, foydalanuvchi ulkan son kiritib yana xuddi paginatsiyasiz kabi server xotirasini to'ldirib qo'yishi mumkin.

Dasturchilar ko'p yo'l qo'yadigan xatolar

Xato: Login sahifasiga umumiy rate limit qo'yish (xakerlar soniyasiga o'nlab parollarni sinab ko'rishi mumkin).
To'g'ri: Login endpointiga LoginAnonThrottle (10/min) kabi qat'iy cheklov o'rnating.

Amaliy topshiriq 15 daqiqa

Oson apps/common/pagination.py da DefaultPageNumberPagination klassini yozing.
O'rta settings/base.py ga pagination va throttling parametrlarini qo'shing.
Qiyin Brauzerda ?page=2&page_size=5 ni sinang va 429 xatosini olishni tekshiring.
AXV

Darsni yakunlaymiz

Keyingi darsda: Statik va Media fayllar, rasmlarni yuklash (Multipart upload) va FileResponse!

PageNumberPagination Throttling (Rate Limit) 429 Status Brute-Force Himoyasi