Django Ratelimit
Django’da ratelimit nedir ve nasıl kullanılır bu makalemizde buna değineceğim. Öncelikle şunu düşünelim. Bir blog uygulamamız var ve her bloğumuza kullanıcılarımız yani üyelerimiz yorum yapabiliyor. Peki art niyetli bir kullanıcı sürekli yorum yaparsa, ya da bir bota takarsa dakikalarda onlarca yüzlerce yorum atmaya çalışırsa ne olacak? Veritabanımız şişecektir.
Ya da başka bir örnekle gösterecek olursak sitemize giriş işlemi yapmaya çalışan bir kullanıcının 5 defadan sonra IP adresinin bloklanmasını ister miyiz,evet isteriz. Belirli bir süre o kullanıcıyı bloklayabiliriz. İşte Django ratelimit bu işe yarar.
Hadi gelin her sefer olduğu gibi bir proje oluşturarak ilerleyelim. Tabii önce sanal ortamlarımızı da kuralım.
python3 -m venv env
Sanal ortamı oluşturduk şimdi aktif edelim.
source env/bin/activate
Django projemizi oluşturalım.
django-admin startproject core
Djangoyu oluşturmuş olduğumuz sanal ortamın içerisine kuralım.
pip3 install django
Admin panelimiz için gerekli migrate işlemlerini de yapalım.
python3 manage.py migrate
Migrate işlemleri tamam şimdi admin panelimize girebilmek için bir superuser oluşturalım.
python3 manage.py createsuperuser
Şimdi ise gelin ratelimit işlemlerimizi yapabilmemiz için bir modül kuralım sanal ortamımıza.
pip3 install django-ratelimit
Şimdi ise settings.py dosyasında bazı ayarlar eklememiz gerekiyor.
Hemen bir url pathi oluşturup bir view yazalım. Normalde ana proje klasöründe view yazılması önerilmez ancak hızlı olması açısından buradan göstereceğim. Siz istediğiniz bir app’te view yazabilirsiniz.
urlpatterns = [
path('admin/', admin.site.urls),
path("/",home_page,name="homepage")
]
hemen view’imizi yazalım.
from django.shortcuts import HttpResponse
def home_page(request):
return HttpResponse("Merhaba")
Template renderlamak ile uğraşmadım siz isterseniz onu da yapabilirsiniz. Konumuz bu değil çünkü.
Şimdi View dosyamıza birkaç şey daha import etmemiz gerek.
from django.shortcuts import HttpResponse
from ratelimit.decorators import ratelimit
@ratelimit(key='ip', rate='5/m', method="GET",block=True)
def home_page(request):
return HttpResponse("Merhaba")
Burada yazdığımız kodları özetleyecek olursam ilk başta gerekli decaretörü view dosyama import ettim.
Ardından decaretörü fonksiyonumun hemen üstüne yazdım. Buradaki parametreleri açıklayacak olursam;
key parametresi kullanıcının ip adresini mi, hesabını mı ya da proxy tarafından geliyorsa client IP adresini mi bloklayacağını söylüyoruz.
rate parametresi ile kaç dakikada / saatte kaç istek yapabileceğini belirtiyoruz.
method parametresi ile view’ımıza hangi http isteği gelirse bloklama işlemleri yapılacağını söylüyoruz.
block parametresi ile de isteğin bloklanıp bloklanmayacağını belirtiyoruz.
Şimdi http://127.0.0.1:8000/ yani ana dizinime 5 kere GET isteği atacağım sayfayı yenileyerek. 6. İsteği atarken 403 hatası alacağım. Hadi hepimiz görelim.
Şuan açılıyor. 5 defa istek yapalım bakalım ne olacak.
Gördüğünüz gibi 6. isteği atarken İzin Reddedildi ve 403 hatası aldık.
Burada çıkan 403 sayfasını istersek customize de edebiliriz
FunctionBased View’de bunun nasıl yapılacağını gördük.
Şimdi ise Class Based Viewlerde ratelimit işlemi nasıl oluyor hızlıca onu örneklerle anlatalım.
from ratelimit.mixins import RatelimitMixin
from django.views.generic import View
class CreateCommentView(RatelimitMixin,View):
ratelimit_key = 'ip'
ratelimit_rate = '2/1h'
ratelimit_method = 'POST'
ratelimit_block = True
Bir Class Based view oluşturdum ve RatelimitMixin’ini view dosyama import edip miras olarak aldım. Aynı Function based view’de olduğu gibi aynı ayarları burda da bu şekilde ayarlıyoruz. Sonuç aynı olacaktır.
Comments
There are no comments yet.