Katta hajmdagi ma'lumotlarni sahifalash va API-ni ortiqcha yuklamalardan himoyalash
10-sinfAdvanced Python Back-end3-hafta · 7-darsServer xotirasini tejash va PageNumberPagination orqali ma'lumotlarni bo'lib berish.
Rate limiting, DoS va brute-force hujumlarini to'xtatish, 429 status kodi.
apps/common/pagination.py va accounts/throttles.py amaliyotlari.
Katta hajmdagi ma'lumotlarni bo'laklab uzatish
50 000 ta postni birdaniga yuklash xavfi
DRF qaytaradigan 4 ta asosiy qatlam
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.
So'rovlar oqimini cheklash va serverni himoya qilish
Ortiqcha so'rovlar darhol 429 Too Many Requests bilan to'xtatiladi
Tizimga kirmagan mehmonlar uchun (IP bo'yicha hisoblaydi, masalan: 60/min).
Ro'yxatdan o'tgan foydalanuvchilar uchun (User ID bo'yicha, masalan: 300/min).
Alohida nozik endpointlar uchun (masalan, login uchun qat'iy: 10/min).
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",
},
}
Brauzerda GET /api/v1/posts/ chaqiriladi — server xotirasida soniya hisoblagich boshlanadi.
1 daqiqa ichida so'rovlar soni 60 taga yetganda, kesh chegarasi to'ladi.
61-so'rovdan boshlab {"detail": "Request was throttled. Expected available in 55 seconds."} qaytadi.
Bosing va tekshiring
Katta ma'lumotlarni server xotirasini qiynamasdan bo'lib berish.
Bosing va tekshiring
Daqiqasiga keladigan so'rovlar sonini me'yorga solish va botlardan himoya.
Bosing va tekshiring
Limitdan oshganda qaytariladigan "Iltimos, biroz kuting" xabari.
Nima uchun pagination sozlamasida max_page_size berilishi shart?
LoginAnonThrottle (10/min) kabi qat'iy cheklov o'rnating.
apps/common/pagination.py da DefaultPageNumberPagination klassini yozing.
settings/base.py ga pagination va throttling parametrlarini qo'shing.
?page=2&page_size=5 ni sinang va 429 xatosini olishni tekshiring.
Keyingi darsda: Statik va Media fayllar, rasmlarni yuklash (Multipart upload) va FileResponse!