Django Rest Framework ile Stok Kayıt & Takip REST API Geliştirme

Adnan KAYA's Blog

Stok Kayıt & Takip REST API Uygulaması

Gereksinimler

  • virtualenv
  • Minimum python3.5
  • Django==2.2.2 & djangorestframework==3.11.0

Geliştirmede Kullanılan Araçlar

  • Linux Mint işletim sistemi
  • Visual Studio Code editörü
  • Django'nun varsayılan olarak kullandığı SQLite veritabanı

Başlangıç

  • Terminalden virtualenv -p python3 env diyerek env adında sanal bir ortam oluşturalım.
  • source env/bin/activate diyerek sanal ortama geçiş yapalım. Sanal ortama geçiş yaptığınızda terminaldeki bilgisayar adınızın önünde (env)<kullanıcı adınız> gibi bir görüntü oluşacak. Bu durum sanal ortama geçiş yaptınız demektir. deactivate diyerek sanal ortamdan çıkabilirsiniz.
  • Terminalden pip install Django==2.2.2 djangorestframework==3.11.0 diyerek kurulumları gerçekleştirelim.
  • Kurulumlar başarıyla sonuçlandıysa projeyi başlatalım. django-admin startproject src diyerek projeyi başlatalım. cd src/ diyerek proje içerisine girip proje klasör yapısını görüntülersek aşağıdaki gibi bir yapı görülecektir.
  • Projenin genel adını src yerine stoktakip yapıyoruz. settings.py dosyasının bulunduğu src klasörü bu halde kalabilir.
  • settings.py modülünü açıp INSTALLED_APPS içerisine rest_framework yazarak Django Rest Framework'u ekliyoruz. Aşağıdaki gibi ekleyebilirsiniz.
  • Terminalden stoktakip projesi içerisinde iken python manage.py runserver 5000 diyerek localhost yani 127.0.0.1 IP adresinde 5000 portunda projeyi ayağa kaldırabilirsiniz. 5000 yazmasanız varsayılan olarak 8000 portunda çalıştırmış olursunuz.
  • Aşağıdaki gibi bir çıktı terminalde görülecektir.
  • Kırmızı olarak You have unapplied migrations... uyarısı Django'nun varsayılan olarak kullandığı admin, auth, contenttypes, sessions application'lar için model sınıflarının veritabanına migrate edilmediği için gelen uyarıdır..
  • CTRL + C diyerek uygulamayı durdurup python manage.py migrate diyerek varsayılan olarak gelen modelleri veritabanına migrate edebilirsiniz. Aşağıdaki gibi bir çıktı gelecektir.
  • python manage.py createsuperuser diyerek yönetici için kullanıcı adı, email ve parola belirleyebilirsiniz.
  • python manage.py runserver 5000 diyerek tekrar web uygulamasını çalıştırıp 127.0.0.1:5000/admin üzerinden yönetim paneline giriş yapabilirsiniz.

Model sınıfları

  • python manage.py startapp stok diyerek stoktakip projesi içerisinde yeni bir application oluşturalım. Proje yapısı aşağıdaki gibi olacaktır.
  • src/settings.py içerisinde stok app'i de ekleyelim.
  • stok/models.py dosyasını açıp aşağıdaki gibi model sınıflarını oluşturalım.
  • Currency ve CurrencyRate modelleri isimlerinden de anlaşılacağı gibi parabirimleri için kullanılacak modellerdir.
  • Terminalde aşağıdaki komutları (python manage.py makemigrations stok ve python manage.py migrate) vererek bu modelleri veritabanına işleyelim.
  • Stok birimleri (kilogram, litre vb.) için ve Tedarikçi için aşağıdaki modelleri de ekleyelim.
  • stok/models.py
  • python manage.py makemigrations stok ve python manage.py migrate komutlarını veriyoruz.
  • Ve son olarak Hammadde Stok için aşağıdaki modeli ekleyelim
  • stok/models.py
  • python manage.py makemigrations stok ve python manage.py migrate komutlarını veriyoruz.

Shell Ortamında İşlemler

  • Terminalde python manage.py shell diyerek shell ortamına geçiş yapalım ve aşağıdaki işlemleri gerçekleştirerek bir kaç veri girişi yapalım.
  • 3 adet parabirimini sistemimize ekledik. Devam edelim:
  • Parabirimleri arasındaki oranları da ekledik.
  • Birimleri de ekleyelim.
  • Her şeyi terminalden shell üzerinden eklemeyeceğiz tabii ki :) . Bunlar sadece ısınma turları...

REST API Başlangıç


  • Şimdi stok uygulaması içerisine api adında bir klasör oluşturup içerisine urls.py, routes.py, serializers.py adında modüller oluşturalım. Proje yapısı aşağıdaki gibi olacaktır.
  • Daha sade bir görünüm için .pyc dosyaları silindi ve 000___.py ile başlayan migrations dosyaları yukarıdaki gösterimden kaldırıldı.

URLS


  • stoktakip/src/urls.py modülünü aşağıdaki gibi düzenleyelim

SERIALIZERS


  • stok/api/serializers.py` modülünü açarak aşağıdaki kodları ekleyelim.
  • Tedarikçi model sınıfının attribute'larını serialize edecek sınıfı yazmış olduk.

ROUTES (API VIEWS)


  • stok/api/routes.py modülünü açarak aşağıdaki kodları ekleyelim
  • stok/api/urls.py modülünü açarak aşağıdaki kodları ekleyelim.
  • Uygulamamız için 127.0.0.1:5000/api/suppliers/ adresine istek (request) yapan istemciler (clients) için tedarikçi listesini (SupplierList) cevap olarak dönen bir api resource yazmış olduk.
  • Projeyi python manage.py runserver 5000 diyerek çalıştıralım ve http://127.0.0.1:5000/api/suppliers/ adresine gidelim. Göreceğiniz durum:
  • Herhangi bir tedarikçi kaydı olmadığı için boş dizi [ ] cevap olarak döndü. Shell ortamına geçiş yapıp veri ekleyebilirsiniz veya generics.ListAPIView sınıfı yerine generics.ListCreateAPIView sınıfını miras alabilir ve sınıfın adından da anlaşılacağı üzere hem listeleme hem de yeni data ekleme işlemi gerçekleştirebilirsiniz. Değişikliği uygulamak için tekrar routes.py modülünü açalım.
  • Django Rest Framework'un sunduğu web tabanlı arayüzü göreceksiniz. Input alanlarına veri girişi yaparak birkaç tedarikçi ekleyelim.
  • POST request için dönen cevap.
  • GET request için dönen cevap
  • Şimdi hammadde stok için serializers, routes ve urls modüllerinde eklemeler yapalım.
  • stok/api/serializers.py
  • stok/api/routes.py
  • stok/api/urls.py
  • Şimdi http://127.0.0.1:5000/api/stocks/ adresine gidelim ve Input alanlarına veri girişi yapıp select box'lardan daha önce shell ortamından girdiğimiz parabirimi (currency) , stok birimi (kg, litre vs.) ve tedarikçi seçimini yapalım.
  • POST request işlemi.
  • GET request işlemi
  • "currency": 1, "basic_unit": 1, "supplier": 2 alanları ID'leri ile gelşmiş durumda. Bu alanlar için ID yerine görmek istediğiniz veriler için Rest Framework'un read_only class'larını kullanabilirsiniz. Örneğin StokSerializer'ı aşağıdaki gibi değiştirin ve tekrar GET request yapın.
  • Cevap olarak aşağıdaki gibi bir sonuç alırız.
  • Başka bir çözüm olarak 2 adet serializer tanımlayıp representation (gösterim) yani GET request için farklı, kayıt ekleme yani POST request için farklı bir serializer tanımlayabilirsiniz. Bunu yaparsanız routes.py modülünde StockList sınıfına get_serializer_class methodunu ekleyerek GET, POST, PUT, DELETE v.s. HTTP methodlarına göre hangi serializer sınıfın kullanılacağına karar verebilirsiniz.
  • serializers.py modülünü açıp StockCreateSerialzer 'ı ekleyip önceki StockSerializer sınıfını da StockListSerializer olarak değiştirelim
  • Bu serializer sınıflarını routes.py modülünü açıp import ederek StockList sınıfını aşağıdaki gibi düzenleyelim.
  • Görüldüğü üzere POST isteği gelirse StockCreateSerializer diğer durumlarda StockListSerializer gelen json datasını serialize edecektir. Değişiklik yaptıktan sonra GET isteğini http://127.0.0.1:5000/api/stocks/ adresine yaparsanız aşağıdaki cevap döner.
  • Django Rest Framework'un sunduğu arayüzde POST işlemini yapabilirsiniz.
  • Tekrar GET isteği yaparak önceden yaptığımız stok listesini görebilirsiniz.
  • Şimdi routes.py modülüne StockDetail sınıfını ekleyelim ve herhangi bir stok detayını görmek için eklemeler yapalım.
  • api/urls.py içerisine StockDetail'i import ederek aşağıdaki path'i ekleyelim'
  • http://127.0.0.1:5000/api/stocks/2 adresine GET isteği yaparsanız ID'si 2 olan stok detayını görürsünüz. Burada serializers.py modülünde StockListSerializer sınıfına bir alan ekleyip direkt detay linkini edinmek için aşağıdaki düzenlemeyi yapalım.
  • HyperlinkedIdentityField , 2 adet parametre almış durumda. view_name urls.py modülünde tanımladığımız StockDetail için yazılan path(('stocks/<int:pk>', StockDetail.as_view() , name='api-stock-detail') view name'dir. lookup_field='pk' ise primary key yani ID baz alınarak detay sayfasına erişileceğini belirtir.
  • http://127.0.0.1:5000/api/stocks/ adresine GET request yaparsanız aşağıdaki gibi url alanı da eklenmiş şekilde liste dönecektir.
  • Güncelleme işlemine geçebilmek için routes.py modülünü açıp StockDetail 'in miras aldığı RetrieveAPIView yerine RetrieveUpdateAPIView değişikliğini uygulayalım.
  • Şimdi herhangi bir stok detayı için güncelleme işlemi yapalım. http://127.0.0.1:5000/api/stocks/2 adresine giderek 2 numaralı stok için güncelleme işlemi yapalım. Güncelleme öncesi:
  • Django Rest Framework web arayüzü güncelleme yapacağımız alanları input alanlarına yerleştirmiş olacak. Değişiklik Yapıp PUT butonuna basarak güncelleme yapalım.
  • Toplam miktar, stok adı, birim fiyat güncellendi.
  • Peki diğer alanları da güncellemek istersek ?.. StockList sınıfı için yaptığımızı burada da yapabiliriz. Detay gösterimi için farklı serializer, güncelleme için farklı serializer kullanabiliriz. routes.py'da StockDetail sınıfını aşağıdaki gibi değiştirelim.
  • http://127.0.0.1:5000/api/stocks/2 adresine giderseniz şimdi, currency, basic_unit, supplier alanlarının da seçilip güncellenebileceğini görürsünüz. PUT request yapalım.
  • Elma -> Elma Suyu olarak, Tedarikçi Murat -> Adnan olarak, currency USD -> TL olarak, basic_unit kg -> lt olarak güncellendi. GET request;

  • Yazar : Adnan KAYA
    Github : https://github.com/adnankaya
    Blog : https://adnankayace.blogspot.com/

    Daha Fazlası için : https://www.django-rest-framework.org/

Yorumlar