Throttling Di Django Rest Framework (DRF) - CRUDPRO

Throttling Di Django Rest Framework (DRF)

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 mengganti UserRateThrottle dan menyetel properti.

Setelan DEFAULT_THROTTLE_RATES['user'].

API mungkin memiliki beberapa UserRateThrottles pada saat yang bersamaan. Untuk melakukannya, timpa UserRateThrottle 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.

Throttling Di Django Rest Framework (DRF)

Pengguna Terotentikasi:- API gagal setelah saya membuat lebih dari 5 permintaan dalam satu jam dengan pengguna terotentikasi.

Throttling Di Django Rest Framework (DRF)

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

Throttling Di Django Rest Framework (DRF)

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'
    }
}

Pengujian

Throttling Di Django Rest Framework (DRF)