Django Rest Framework Dersleri - 1

Django Rest Framework Dersleri | 1

Django Rest Framework Notlarım

Temel Yapı (Basic Structure)

DRF Architecture
  • 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.

Gereksinimler

  • Proje notlarımı alırken:
    • Python : 3.6.7 sürümü
    • Virtual Environment : virtualenv programı
    • Django : Django==2.1.5 sürümü
    • Djang Rest Framework : djangorestframework==3.9.0 sürümü
    • IDE: Visual Studio Code kullanıyorum. (Opsiyonel)
    • İşletim Sistemi: Desktop: MATE 1.20.1 Distro: Linux Mint 19.1 Tessa (Opsiyonel)

Python, Virtual Environment & Django Kurulum ( Installation )
  • Python sanal ortamına geçiş yapalım.

  • 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:
  • 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.
  • 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.
  • 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
  • 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.
  • 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.
  • 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.
  • Yukarıdaki gibi bir görüntü oluşacak.
  • Şimdi tarayıcı açıp http://127.0.0.1:8000/apitr/libraries/ url'ini yazalım.
  • Aşağıdaki gibi bir sayfa göreceksiniz.
DRF_LIST
  • Liste boş olduğu için mouse imlecinin durduğu yerde [ ] boş bir dizi var.
  • post işlemi ile content içerisine {"name" : "Endülüs"} gibi bir veri yazıp kayıt işlemi gerçekleştirelim.
  • Verileri json formatında gönderip alıyoruz
DRF_LIST_1
  • Gördüğünüz gibi ilk kaydımızı gerçekleştirdik.
  • { "title" : "Bağdat" } gibi bir post denemesi yaptığımızda.
DRF_LIST_2
  • Hata mesajı ile karşılaşıyoruz. Çünkü uygun olan field(alan) yani sınıf attribute'u "name" olarak verilmelidir. Biz ise "title" olarak verdik.

Özet:
  • Django Rest Framework'e kısa bir giriş yaptık.
  • GET, POST isteklerini karşılayacak küçük bir başlangıç yaptık.
  • Client olarak browser yerine Postman, Curl gibi araçları da kullanabilirsiniz.

Yorumlar