Django Rest Framework ile Blog App, Part 1
Heeepiinze merhabalar, bu serimizde Django Rest Framework (bundan sonra DRF diyeceğim kısaca) ile ufak bir blog application yapalım dedim. Yani gördüklerimden kaynaklardan çala çırpa öğrene öğrene türkçeleştirerek sizlere aktaracağım diyebilirim..
Yukarıdaki yazımda ufak bir giriş yapmıştım tekrar buna bakabilirsiniz çoook üstünkörü bir şekilde giriş yapmıştık. Şimdi girişi şöyle doğaçlama eksik kalanlarla yapalım;
Şimdi Http olarak bildiğimiz ‘Hyper Text Transfer Protocol’ aslında ne iş yapmaktadır?
Yuakrdaki grafikte görebileceğimiz gibi; client server’a bir request(istek) atar ve bir response (dönüş) alır. Bunu yapan protokole HTTP ismini vermişler ve kullanmışlaaar. Arkasında neler yapıyor burası? Yani biz istek attık tıklamayı yaptık front-end kısmında sonra ne oluyor? Başlıyor Get/Post işlemleri ardından back-end işlemleri başlıyor hop bu back-end ne yapıyor işlemleri birleştirmek için database’e gidiyor oradan data’ları alıp front-end’e kullanıcıya kadar geri döndürüyor. Bu işlemler mobil programda da böyle, web işlemlerinde de böyle; internet kullanan her yerde bu protokol işlemleri bu şekilde yürümektedir. Önceki yazımda bahsetmediğim ‘HTTP Status Code’ kısmına değinmek istiyorum.
En çok kullanılan HTTP Request Metodları Nelerdi?
- GET
- HEAD
- POST
- PUT
- DELETE
diyebiliriz. Bunların ne olduğunu anlatmama gerek yok, pekiştirmek için Django Rest Framework dökümantasyonunu okuyarak ulaşabilirsiniz. Şimdi projemiz üzerinden çalışmalara başlayalım. GO! (projeni oluştur, ben core adında bir proje oluşturdum)
$ python -m venv venv
$ venv\Scripts\activate
diyere projemize virtual environment ekledik. Ardından django’muzu pip ile projemize eklemeyi unutmayalıım.
$ python manage.py startapp blog
$ python manage.py startapp blog_api
şeklinde ‘blog’ ve ‘blog_api’ şeklinde uygulamalarımızı oluşturduk. Basic Django bilgimizee dayanaraktan core’un içindeki urls.py’a giderek oluşturduğumuz 2 app’in url’ini tanımlayalım bakalım.
blog_api’yi ‘api/’ şeklinde tanımlamamızın sebebi rest’i api/ url’inde görüntülemek istediğimizdendir. Ardından app’lerimiz içerisinde urls.py dosyalarını oluşturmayı unutma. Oluştur ki sıkıntı olmasın. :)
Eğer şuan uyguluyorsanız bunları warning’ler başınıza toplanmıştır. PostList, PostDetail bunları daha oluşturmadık çünkü sıra onlara gelecek biz url’lerimizi kısa yoldan oluşturduk.
Ne yaptık bu url tanımlarken? ilk ‘core’ kısmında api ve front kısımlarını tanımladık orası kolay. blog/urls.py’da ne yaptık? template’mizi tanımladık çünkü iki farklı kısımla uğraşırsak diye front ve backend kısımlar için bu şekilde tanımlama yaptık; dilerseniz unu tek uygulama ve tek url içerisinde de yapabilirdik ama maksat güzel olsun. Asıl ilgi alanımız blog_api.
Orada şuan uyguluyorsan göreceksin ki bol warning içerek kısımda PostDetail’i primary key’ine göre; ana sayfada ise (localhost:8000/api) tüm post’ları listeleyebileceğimiz bir tanımlama gerçekleştirdik.
He unutmadan settings.py’a git ve INSTALLED_APPS içerisindeki tanımlamalarını yap, unutma :)
Az önce index.html’e gönderdik ama bunu oluşturmadık; hemen ana dizinde templates/index.html oluşturabiliriz test için. Şey dediğini duydum bak; ee bu gitmez ki o zaman blog’un içinde arar? Araayamayacak.
Çünkü yukarıda gördüğün gibi base olarak alacağı template klasörü dümdüz ana dizindeki ‘/templates’ klasörü olacak.
Şimdi run’larsak bir şey elde edemeyeceğimizi biliyorsun bir sürü warning’imiz var biraz ezber gittik çünkü ve view’larımızı tanımlamadan url’lerin içierisine import ettik. Onları yapacağız fakat öncesinde bu Post’umuzun database’de yerini alması için model’imizi oluşturmamız gerekecek. GO!
Öncelikle kütüphanelerimizi import edip Category model’imizi oluşturduk. Şimdi sıradaki işlem Post model.
Tamamdıır; şimdi api işlemlerine giriş yapabiliriz hemen view’a bir gidip bakalım. Önce bir serializer oluşturralım ki işlemlerimiz kolaylaşsın. Neydi bu serializer’lar? View’lar içerisinde oluşturduğumuz dataları JSON, XML gibi formatlara çevirip kullanmamızı sağlayan serileştiricilerdi. Hatırlarsak front-end tarafından bahsetmiştik ön yüzde yaptığımız uygulama (React, Vue, etc.) gönderdiği request’in dönüşünde artık backend’in içinde Restful API kullandı; bunu son kullanıcıya getirirken JSON, XML formatında getirmesini sağlayan işleme serializer; serileştirme adı verilmektedir. Bu nasıl işimize yarayabilir ki? Tamamıyla verileri işlememizi kolaylaştırıp python data type’larına (dict, string vs. vs.) dönüştürecektir.
Diyerekten basit bir serializer tanımladık başlangıç için çok basit. Model serializer’ı kalıtım alarak bunu gerçekleştirdik. Post model’imizi yukarda import ettiğimiz için inheritence’ı buradan alarak gerçekleştirebilir, gerçekleştirmeli..
Artık views’larımıza giriş yapabiliriz.
rest_framework generics fonksiyonumuzu import ettik; çünkü burada alacağımız kalıtımın ileride tekrarlanacağını generic views’lar ile yapacağımızı söyledik.
Öncelikle Django Rest Framework’te daha fazlasını görebileceğiniz benim yalnızca işimze yarayacakları kullandığım APIView’lar bulunmakta. generics fonksiyonuyla bunlara erişebilmekteyiz; Create, List, Retrieve, Destroy vs. bir çok APIView bulunmakta. Aslında her biri basit işlemleri kendi içerisinde yapmakta. Örneğin ListCreateAPIView fonksiyonu içerisinde get ve post metodları kullanarak işlemleri gerçekleştirecektir fakat queryset ve serializer_class’ı tanımlatarak :)
queryset; ELimizdeki view’ın (ListCreate) içerisinde kullanılması gereken nesneleri tanımladığımız kısımdır. Yani modelimizdeki bağladığımız model yani PostModel’in içindeki objeler (nesneler) göndererek işleme sokacağız. serializer_class’a geldiğimizde de bildiğimiz üzere hangi serileştiriciyi kullanmamız gerektiği (PostSerializer) yönünde bildirim yapmaktayız. e şimdi warning yoksa bi run’layalım.
HTTP 200 OK! aldık :) Demekki her şey hazır alttan bir Post yükleyelim bakalım..
İlk post’u bu şekilde oluşturduk sıkıntısızca..
Sanırım Şimdilik bu kadar yeterli benim için :9 2. Part’ta test işlemleriyle birlike permissions’ları ayarlayabiliriz diye düşünüyorum.. Hemen dökümantasyonu bırakıyorum inceleyin. Bol kodlamacıklar :)