Throttling Di Django Rest Framework (DRF)
Apakah itu Throttling?
Throttling ialah feature dari Django Rest Frame-work yang memungkinkannya Anda batasi tingkat permintaan yang dibikin oleh pemakai atau grup pemakai. Ini bisa bermanfaat untuk menahan pemakai jahat lakukan spam pada API Anda atau operasi intens sumber daya yang bisa mengakibatkan kemelut pada server Anda. Throttling bisa dipakai untuk batasi jumlah permintaan yang bisa dilaksanakan dalam periode waktu tertentu atau berdasar gabungan alamat IP dan ID pemakai. Bisa saja untuk mengonfigurasikan penataan perlambatan supaya cuma mempengaruhi tipe permintaan tertentu, seperti permintaan POST atau permintaan DELETE, agar semakin membuat perlindungan API Anda.
Itu
AnonRateThrottle
cuma akan batasi pemakai yang tidak diautentikasi. Alamat IP dari permintaan yang masuk dipakai untuk hasilkan kunci unik untuk dicekik.Tingkat permintaan yang diizinkan ditentukan dari salah satu dari yang berikut (dalam urutan preferensi).
rate
Properti di class, yang dapat disediakan dengan mengesampingkanAnonRateThrottle
dan pengaturan properti.Setelan
DEFAULT_THROTTLE_RATES['anon']
.
AnonRateThrottle
cocok jika Anda ingin membatasi tingkat permintaan dari sumber yang tidak dikenal.
UserRateThrottle
akan membatasi pengguna ke tingkat permintaan tertentu di seluruh API. Id pengguna digunakan untuk membuat kunci unik untuk dicekik. Permintaan yang tidak diautentikasi akan kembali menggunakan alamat IP dari permintaan yang masuk untuk membuat kunci unik yang akan dicegah.Tingkat permintaan yang diizinkan ditentukan dari salah satu dari yang berikut (dalam urutan preferensi).
Properti
rate
di class, yang dapat disediakan dengan menggantiUserRateThrottle
dan menyetel properti.Setelan
DEFAULT_THROTTLE_RATES['user']
.API mungkin memiliki beberapa
UserRateThrottles
pada saat yang bersamaan. Untuk melakukannya, timpaUserRateThrottle
dan setel "scope" unik untuk setiap class.
Penerapan
# urls.py
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
from django.urls.conf import path,include
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView, TokenVerifyView
router.register("studentapi", views.StudentModelViewSet, basename="student")
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(router.urls)),
]
# api/models.py
from django.db import models
class Student(models.Model):
name = models.CharField(max_length=100)
roll = models.IntegerField()
city = models.CharField(max_length=100)
#api/serializers.py
from rest_framework import serializers
from .models import Student
class StudentSerializer(serializers.ModelSerializer):
class Meta:
model = Student
fields = ["name", "roll", "city"]
#views.py
from .models import Student
from .serializers import StudentSerializer
from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated, AllowAny, IsAdminUser, IsAuthenticatedOrReadOnly, DjangoModelPermissions, DjangoModelPermissionsOrAnonReadOnly
from rest_framework.authentication import SessionAuthentication
from rest_framework.throttling import AnonRateThrottle,UserRateThrottle
class StudentModelViewSet(viewsets.ModelViewSet):
queryset= Student.objects.all()
serializer_class = StudentSerializer
authentication_classes=[SessionAuthentication]
permission_classes=[IsAuthenticatedOrReadOnly]
throttle_classes = [AnonRateThrottle, UserRateThrottle]
# settings.py
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_RATES':{
'anon':'2/day',
'user':'5/hour'
}
}
Pengujian API
Pengguna Anonim: - API gagal setelah saya membuat lebih dari 2 permintaan dalam sehari tanpa autentikasi.
Pengguna Terotentikasi:- API gagal setelah saya membuat lebih dari 5 permintaan dalam satu jam dengan pengguna terotentikasi.
Terapkan Throttle Kustom ke Tampilan
# api/throttling.py
from rest_framework.throttling import UserRateThrottle
class CustomRateThrottle(UserRateThrottle):
scope='custom'
# settings.py
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_RATES':{
'anon':'2/day',
'user':'5/hour',
'custom':'3/minute'
}
}
#views.py
from .models import Student
from .serializers import StudentSerializer
from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated, AllowAny, IsAdminUser, IsAuthenticatedOrReadOnly, DjangoModelPermissions, DjangoModelPermissionsOrAnonReadOnly
from rest_framework.authentication import SessionAuthentication
from rest_framework.throttling import AnonRateThrottle,UserRateThrottle
from api.throttling import CustomRateThrottle
class StudentModelViewSet(viewsets.ModelViewSet):
queryset= Student.objects.all()
serializer_class = StudentSerializer
authentication_classes=[SessionAuthentication]
permission_classes=[IsAuthenticatedOrReadOnly]
throttle_classes = [AnonRateThrottle, CustomRateThrottle]
Pengujian Throttle Khusus
ScopedRateThrottle
class ScopedRateThrottle
dapat digunakan untuk membatasi akses ke bagian tertentu dari API. Throttle ini hanya akan diterapkan jika tampilan yang sedang diakses menyertakan properti .throttle_scope.
Kunci throttle unik kemudian akan dibentuk dengan menggabungkan "scope" permintaan dengan id pengguna atau alamat IP unik.
Penerapan
# api/views.py
from .models import Student
from .serializers import StudentSerializer
from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated, AllowAny, IsAdminUser, IsAuthenticatedOrReadOnly, DjangoModelPermissions, DjangoModelPermissionsOrAnonReadOnly
from rest_framework.authentication import SessionAuthentication
from rest_framework.throttling import ScopedRateThrottle
class StudentModelViewSet(viewsets.ModelViewSet):
queryset= Student.objects.all()
serializer_class = StudentSerializer
authentication_classes=[SessionAuthentication]
permission_classes=[IsAuthenticatedOrReadOnly]
throttle_classes = [ScopedRateThrottle]
throttle_scope='custom'
# seetings.py
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_RATES':{
'anon':'2/day',
'user':'5/hour',
'custom':'10/minute'
}
}