Django Rest Framework'un temel yapısını şekilde görebiliyoruz.
User client olarak yazdığımız API'ye istekte bulunur(request). Alınan bu istek tabii ki url üzerinden gelir.
Her url için yazılmış belirli bir view vardır. Örneğin; sınıf bazlı UserList veya Users adında kullanıcıların listesinin cevap olarak döndüğü bir view class veya method yazılmıştır.
views modülü serializers'ı kulanarak CRUD(Create, Retrieve, Update, Delete) işlemlerini gerçekleştirir. Tabi models'a ait model sınıflarını da kullanır.
serializers modülünde, models modülünde bulunan sınıfların attribute'larını(özelliklerini) baz alarak gelen istek(request) ve giden cevap(response)lar için düzenli veri formatı oluşturulur. Gelen ve giden verinin doğrulanmış(validated) olması durumunda sunucumuz tarafından başarılı cevaplar döner. Aksi halde bizim de özelleştirebileceğimiz hata mesajları dönecektir.
models içerisinde web uygulama için tanımlanmış, projede gerekli olan varlıkların sınıf olarak gösterimi bulunur. Örneğin User, Book, Student, Teacher.. sınıfları gibi. Bu sınıflar arasında ilişki de olabilir. Many To One, One to One, Many To Many.. gibi.
managers opsiyonel bir modüldür ancak kullanımı bazı yerlerde faydalı olabilir. Örneğin User ve Profile adında model sınıflarımız olsun. Bu sınıflardan User için kayıt yapıldığında Profile sınıfının da kayıt olmasını istiyorsak managers modülünü tercih edebiliriz. Olmazsa olmaz bir şey değildir ancak clean code açısından ve daha sayamadığım bir çok yönden faydası bulunuyor.
django-admin startproject trdrf diyerek trdrf adında projemizi başlatalım.
python manage.py startapp apitr diyerek apitr adında bir app oluşturarak bizim için api olacak bir app başlatalım.
trdrf/settings.py'da INSTALLED_APPS'a aşağıdaki satırları ekleyelim:
xxxxxxxxxx
INSTALLED_APPS = [
...
#Django Rest framework
'rest_framework',
#Projeye ait app'ler
'apitr.apps.ApitrConfig',
]
apitr adında oluşturduğumuz app altında bir dosyaya urls.py diyelim ve boş kalsın şimdilik.
trdrf/urls.py içerisine api olarak kullanacağımız url tanımlamasını ekleyeceğiz.
x
"""trdrf URL Configuration
"""
fromdjango.contribimportadmin
fromdjango.urlsimportpath, include
urlpatterns = [
path('admin/', admin.site.urls),
# projemize ait app'ler icin url tanimlari
path('apitr/', include('apitr.urls')), # apitr isimli app'deki urlleri buraya tanıtıyoruz.
]
Yukarıdaki url tanımlamasından sonra uygulamamızı kodlamaya başlayalım...
Kodlamaya başlangıç
Şimdi temel drf(django rest framework) yapısındaki modülleri oluşturalım.
Veritabanı olarak sqlite varsayılan veri tabanını kullanıyoruz.
apitr/models.py altında aşağıdaki sınıfımızı oluşturuyoruz.
xxxxxxxxxx
# harici importlar
fromdjango.dbimportmodels
# dahili importlar
classLibrary(models.Model):
name = models.CharField(max_length=120)
classMeta:
db_table = 'library'# veritabanında sınıfa karşılık tablo adını belirtmek için
Terminalden trdrf projesi içindeyken $ python manage.py makemigrations apitr diyerek model sınıfını veritabanında tabloya dönüştürmek için hazır hale getirelim.
Daha sonra $ python manage.py migrate diyerek işlemi veritabanına gönderelim
Apply all migrations: admin, apitr, auth, contenttypes, sessions
Running migrations:
Applying apitr.0002_library... OK
(env) adnan@ce:~/arge/drf/trdrf$
Yukarıdaki gibi mesajlarla karşılaşacaksınız. Eğer varsayılan olarak tanımlı superuser yani admin için olan model sınıflarını da başta yapmadıysanız onlar da burada görülebilir. Yani sizin ekran çıktı mesajınız daha uzun olabilir.
apitr/serializers.py adında bir dosya oluşturup aşağıdaki serializer sınıfını yazalım.
xxxxxxxxxx
fromrest_frameworkimportserializers
# dahili importlar
fromapitr.modelsimportLibrary
classLibrarySerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
name = serializers.CharField(max_length=120)
defcreate(self, validated_data):
returnLibrary.objects.create(**validated_data)
Yukarıdaki yapıya dikkat ederseniz serialization işlemi için models.py'daki sınıfımıza benzer bir yapıyı burada da oluşturduk.
create methodu post isteklerine karşılık gelecek ve Library model sınıfının varsayılan objects model manager referansını kullanıp doğrulanmış veriyi(validated data) oluşturacak.
apitr/views.py içerisine aşağıdaki sınıf bazlı view için LibraryList class'ını yazalım
LibraryList sınıfı APIView sınıfını miras alıyor. Burada get, post methodlarını kullanarak client'ın yaptığı isteklere cevap verecek methodları yazıyoruz.
get methodu:
Library.objects.all() Django sorgusu ile bütün kayıtlı dataları veritabanından alıyoruz.
LibrarySerializer(libraries, many=True) diyerek veritabanından alınan bütün datayı serialize ediyoruz. Yani Library sınıfına ait nesneyi kolayca ulaşılabilir bir formata çeviriyoruz.
Response(serializer.data) cevap olarak da uygun formata çevrilmiş datayı cevap olarak dönüyoruz.
Url üzerinden bu sınıfa yapılacak GET request(istek)leri bu method karşılayacak.
post methodu:
post(self, request, format=None): bizim için şu anlık önemli olan request parametresi. Client'ın yaptığı isteğe dair veriyi, bilgileri request taşıyacaktır.
request.data içerisinde client'ın yaptığı post methodu ile gönderilen data bulunuyor.
serializer = LibrarySerializer(data=request.data), diyerek serializer sınıfımıza client'ın gönderdiği veriyi gönderiyoruz.
if serializer.is_valid() diyerek gelen datanın uygun formatta olup olmadığını kontrol ediyoruz.
serializer.save() format uygunsa kaydetme işlemi
Response(serializer.data, status=status.HTTP_201_CREATED) cevap olarak kaydedilen data ve HTTP cevap mesajı ve kodu.
format uygun değilse Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) diyerek hata mesajlarını ve http mesajı ve kodunu cevap olarak veriyoruz.
apitr/urls.py açalım ve istemciler(clients) için uygun URL yazalım.
xxxxxxxxxx
fromdjango.urlsimportpath
# dahili importlar
fromapitr.viewsimportLibraryList
urlpatterns = [
path('libraries/', LibraryList.as_view()),
]
views içerisinden LibraryList sınıfımızı import ettikten sonra url tanımlamasını libraries/ diyerek yaptık.
Root URL olarak apitr/ seçmiştik hatırlarsanız. Burada libraries/ url'sini de ekleyerek http://127.0.0.1:8000/apitr/libraries/ üzerinden GET, POST işlemlerini gerçekleştirebileceğiz.
LibraryList.as_view() sınıfı view olarak dönüştürüp url'ye gelen isteklere cevap verecek hale getirir.
Terminalden trdrf projesi içindeyken $ python manage.py runserver diyerek projemizi başlatalım.
Yorumlar