Django ile "Merhaba, Dünya!"

2019-05-23

Merhabalar, yoğun geçen bir sürecin ardından yeni bir blog yazısı yazmak için fırsat kolluyordum. Fakat oturup yazmaya başlamazsanız doğru zaman hiç gelmeyebiliyor. Ben de kolları sıvadım bir şeyler yazayım dedim.

Genellikle React ve React Native ile ilgilendiğim ve daha çok client-side uygulamalar geliştirdiğim için frontend teknolojileriyle ilgili makaleler bekliyor olabilirsiniz. Fakat server-side alanında da severek kullandığım bir framework olan Django ile ilgili de makaleler yazmak istiyorum.

Neden Django?

Django kendisini bir web framework olarak tanımlıyor. Web geliştirme yaparken temel olarak karşılaşılan belli başlı problemler vardır. Veritabanına bağlanmak, belli sayfalarda belli içerikler göstermek, uygulamanın güvenliğini sağlamak ve bunun gibi daha bir çok problemi çözmekten sorumluyuz. Tekerleği yeniden icat etmeden daha hızlı, güvenli ve sürdürülebilir bir geliştirme yapabilmemiz için bu gibi frameworkler yardımımıza koşuyor.

Django felsefe olarak "batteries-included" yaklaşımıyla temel bir web uygulaması geliştirmek için gerekli bütün araçları paketlenmiş şekilde sunmayı amaçlar. Mesela admin paneli, authentication, bir çok veritabanı desteği, güvenlik gibi daha birçok konu bizim için düşünülmüştür.

Django'nun birbaşka güzel tarafı ise Python gibi okuması/yazması kolay kendi içerisinde ayrı bir felsefesi olan ve şu sıralar dünyanın en çok kullanılan programlama dillerinden biri kullanılarak geliştirilmiştir.

Django'nun en sevdiğim yanı ise olgun bir teknoloji olması. 2005'den bu yana, web teknolojileri için uzun bir süre, aktif bir şekilde geliştirilmeye devam ediyor.

Sözü daha fazla uzatmadan Django ile "Merhaba, Dünya!" diyelim!

Burdan sonra makaleyi uygulamalı bir şekilde takip etmenizi tavsiye ederim. Bunun için bilgisayarınızda Python 3 ve pipenv kurulu olması gerekiyor. Şimdi masaüstüne gelip "helloworld" adında bir klasör oluşturalım. Daha sonra o klasörü tercih ettiğiniz bir kod editöründen açabilirsiniz. Ben Visual Studio Code kullanıyorum.

Komut panelinden klasörü oluşturduğumuz dizine girelim ve hemen içerisinde şu komutu çalıştıralım.

pipenv install django

Yukarıdaki komut klasörün içerisinde bir sanal ortam oluşturacak ve içerisine Django'yu indirecek. Oluşturulan bu sanal ortam sayesinde daha sonra Django'nun farklı bir sürümüyle proje geliştirirken çakışma yaşanmasını önlüyor olacağız. İndirme süreci bittiyse eğer aşağıdaki komut yardımıyla sanal ortamı aktif hale getirelim.

pipenv shell

Eğer buraya kadar herhangi bir hata yapmadıysanız veya başka bir şey ters gitmediyse komut panelinde bulunduğunuz dizinin isminin hemen önünde parantez içerisinde sanal ortamın ismini görüyor olmalısınız.

Django başarılı bir şekilde indirildiğine ve sanal ortam da aktif hale geldiğine göre projemizi oluşturabiliriz. Bunun için Django'nun bize verdiği bir komutu kullanıyor olacağız.

django-admin startproject helloworld_project .

Django ile web geliştirme yaparken belli bir yapıyı takip etmemiz gerekir. Bunlardan ilki proje(project) ve uygulama(app) arasındaki farkı anlamak olabilir. Mesela bir web sitesi geliştiriyorsak bu web sitesine bağlı bir blog uygulaması olabilir veya bu web sitesi içerisinde online bir market uygulaması olabilir, ya da müşterilerle canlı bir şekilde iletişim kurulabilecek sohbet uygulaması olabilir.

Bir önceki komutun sonundaki nokta dikkatinizi çekmiştir diye düşünüyorum. O nokta oluşturduğumuz bir proje için ayrı bir klasör oluşturmak yerine doğrudan bulunduğumuz dizin içerisine kurulumu sağlıyor.

Pekala şimdi oluşturduğumuz proje ile gelen Django'nun otomatik olarak oluşturduğu dosyaları kısaca tanıyalım.

  • "settings.py" adından da anlaşılabileceği gibi projemizin bütün ayarlarının bulunduğu dosya. Ne gibi ayarlamalar bunlar? Mesela herhangi bir veritabanını kullanırken bu dosya içerisinden gerekli ayarlamalar yapılabilir. Biz bu uygulama içerisinde veritabanı kullanmayacağız ama oluşturduğumuz uygulamaları projeye tanıtmak için bu dosyayı kullanıyor olacağız.

  • "urls.py" herhangi bir request gönderildiğinde hangi sayfanın response olarak dönmesine karar veren dosya.

  • "wsgi.py" geliştirdiğimiz projeyi deploy ederken bize yardımcı olan dosya.

  • "manage.py" ise yeni bir uygulama oluştururken veya lokal web sunucusunu çalıştırırken girdiğimiz komutları çalıştıran Django'nun bize verdiği başka bir dosya.

Şimdi isterseniz Django'yla birlikte gelen yerel web sunucusunu çalıştıralım.

python manage.py runserver

Bu komutu girdikten sonra Django size bir link gönderecek cevap olarak. Kontrol tuşuna basılı tutarak sol tık yaptığınızda web tarayıcınız aracılığıyla Django'nun otomatik oluşturduğu karşılama sayfasını görebilirsiniz.

Yukarıdaki komutu girdikten sonra yerel web sunucusunun çalıştığı adresle birlikte gelen birkaç uyarı görüyor olmalısınız. Merak etmeyin şimdilik bize engel olacak bir durum değil. Fakat bu uyarıyı görmek yine de sizi rahatsız ediyorsa CTRL+C ile yerel web sunucusunu durdurun ve aşağıdaki komutu girin.

python manage.py migrate

Tekrar ediyorum bu makale içerisinde veritabanı ile herhangi bir işimiz olmadığı için bu konu üzerinde fazla durmadan sonraki aşamaya geçiyorum.

Şimdi sıra geldi uygulama oluşturmaya. Bu aşamada uygulamanıza herhangi bir isim verebilirsiniz. Uygulama temel olarak bize istediğimiz bir url'de istediğimiz bir sayfayı göstereceği için ben "pages" adını vereceğim.

python manage.py startapp pages

Bu komutla birlikte Django projemiz içerisinde bizim için yeni klasörler oluşturmuş olacak. Bunları kısaca tanıyalım.

  • "admin.py", Django ile birlikte gelen admin uygulaması için ayarlamaların yapıldığı dosya.

  • "apps.py", bu uygulamanın kendi ayarlarını içerdiği dosya.

  • "migrations/" dosyası "models.py" dosyasındaki değişikleri takip eder.

  • "models.py", veritabanı modellerimizi tanımladığımız dosya.

  • "tests.py", uygulama için teslerin yazıldığı dosya.

  • "views.py" ise gelen request'leri ve response'ları kontrol ettiğimiz yer.

Uygulamamızı oluşturduk ama bunu Django'ya bildirmedik. Django'nun bu uygulamadan haberi olması için proje klasörü içerisindeki "settings.py" dosyasınına küçük bir ekleme yapacağız. "INSTALLEDAPPS"_ adında tanımlanmış bir liste yapısı göreceksiniz orada. String bir ifade olarak yeni bir eleman ekleyeceğiz o listeye. Yani listenin son hali aşağıdaki gibi olmalı.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'pages.apps.PagesConfig', # bizim oluşturduğumuz uygulama
]

Şimdi sıra geldi Views ve URLConfs konusuna. Views, Django'da bir sayfada hangi içeriğin görüntüleneceğine, URLConfs ise bu içeriğin hangi adreste gösterileceğine karar verir. Hemen uygulama klasörümüzün içerisindeki "views.py" dosyası açalım ve anasayfa için bir view yazalım.

from django.http import HttpResponse

def homePageView(request):
    return HttpResponse('Hello, World!')

Yukarıda anasayfamızda göstermek istediğimiz içerik için bir fonksiyon yazdık adına "homePageView" dedik. Django'nun http kütüphanesi içerisindeki HttpResponse metodunu kullanarak sayfaya "Hello, World!" yazdırdık.

View kısmı tamam. Göstereceğimiz içeriği belirledik fakat hangi adreste göstereceğimizi belirlemedik. Bunun için uygulama klasörümüz içerisine "urls.py" dosyası oluşturalım ve içerisinde gerekli işlemleri yapalım.

from django.urls import path

from .views import homePageView

urlpatterns = [
    path('', homePageView, name='home')
]

Yukarıda Django'nun içerisinde gelen urls kütüphanesinden path metodunu dosyamıza dahil ettik. Daha sonra bir önceki aşamada oluşturduğumuz view'u dahil ettik. Hemen ardından urlpatterns adı verilen bir liste oluşturduk ve içerisinde path metodunu kullandık.

İşimiz daha bitmedi. Biz bu urlpattern aracılığıyla istediğimiz içeriğe ulaşmak istiyorsak proje klasörü altındaki "urls.py" dosyasına da, uygulama klasörü altındaki "urls.py" dosyasını dahil etmemiz lazım.

from django.contrib import admin
from django.urls import path, include # include metodunu dahil edelim

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('pages.urls')), # uygulamamızın url'lerini dahil edelim
]

Tebrikler! Artık komut panelinden aşağıdaki komut yardımıyla yerel web sunucumuzu çalıştırıp çıktımızı görebiliriz.

python manage.py runserver

Sonuç olarak çok gelişmiş bir proje oluşturmadık fakat günümüzde bütün modern Django web uygulamalarında kullanılan yöntemleri pekiştirmiş olduk. Bundan sonraki makalelerimde daha ileri seviye konulara değinebilirim. Oluşturduğumuz projenin kaynak kodlarına şuradan ulaşabilirsiniz.