Bölüm 01 : Django ile tanışalım

Ceviz Viki sitesinden

Git ve: kullan, ara

Not : Bu kitap bölüm bölüm http://www.djangobook.com/en/2.0/ adresinden Türkçe'ye çevrilecektir.


Konu başlıkları

Django ile tanışalım

Django (yan-go diye okunur) Web geliştirme sürecini kolaylaştıran ve bu sayede size zaman kazandıran bir Web Çatısı (Web Framework)'dır. Django kullanarak, yüksek kaliteli Web uygulamalarını, mimimum yaygara ile halledebilirsiniz.

Web geliştirmenin en güzel yanları: heyecan verici, yaratıcı olmasının yanında; en kötü yanları ise kendini tekrarlaması, sinir bozucu ve rahatsızlık verici olmasıdır. Django uygulamanızın eğlenceli kısımlarına -- uygulamanızın püf noktalarına -- kendini tekrar etmeden odaklanmanızı sağlar. Bunu yaparken, yaygın Web geliştirme şablonlarına yüksek-seviye soyutlamalar getirmekte, sürekli kullanılan programlama işlemleri için kısayollar barındırmaktadır ve problem çözümü için temiz bir yol sunmaktadır. Aynı zamanda, Django yolunuzun dışında kalarak, gerektiğinde çatı çerçevesi dışında çalışmanıza da izin vermektedir.

Bu kitabın (sitenin) amacı sizi bir Django uzmanı yapmaktır. İki ana hat vardır. İlk olarak Django ile nasıl Web uygulaması yapacağınızı anlatıyoruz ve ikinci olarak yüksek-seviye terimleri uygulamanız için nasıl uygulayacağınızı tartışıyoruz. Bu kitabı okuyarak hızlıca ve temiz bir kodla ve aynı zamanda kolayca yönetilebilen güçlü Web sitelerini oluşturmanızı sağlayan yetenekleri öğreneceksiniz.

Web Çatısı da Nedir?

Django yeni nesil tanınmış web çatıları arasında yer almaktadır, fakat bu terim tam olarak neyi ifade etmektedir?

Bu sorunun cevabı şöyle verilebilir, Python ile geliştirilmiş ve herhangi bir web çatısı kullanmayan bir web uygulaması düşünelim. Bu giriş bölümünde, temel bir görevi herhangi kısayol olmadan halletmeyi ele alacağız, umarız kısayolların ne kadar kullanışlu olduğunu kavrarsınız. (Ayrıca işleri kısayollar olmadan halletmeyi bilmek de değerlidir, çünkü kısayollar her zaman kullanılabilir olmayabilir. Ve en önemlisi bu şeylerin neden bu yoldan yapıldığını bilmek sizi daha iyi bir Web geliştiricisi yapacaktır.)

Bir çatı kullanmadan, Python ile sıfırdan bir Web uygulaması yapmanın en kolay yolu 1998 den süregelen CGI standartını kullanmaktır. İşte size nasıl çalıştığının yüksek-seviye açıklaması: Html çıktısı veren Python scriptinizi hazırlayın ve ".cgi" uzantısı ile kaydedip Web sunucunuza gönderin ve Web tarayıcınızdan bu scripte ulaşın. Bu kadar.

Bir Python CGI scripti örneği vermek gerekirse, aşağıdaki script veritabanından en son yayınlanmış son 10 kitabı listelemektedir. Sözdizimi hakkında merak etmeyin, sadece yaptığı basit şeylere göz gezdirin:

#!/usr/bin/env python

import MySQLdb

print "Content-Type: text/html\n"
print "<html><head><title>Kitaplar</title></head>"
print "<body>"
print "<h1>Kitaplar</h1>"
print "<ul>"

connection = MySQLdb.connect(user='ben', passwd='izinver', db='veritabanim')
cursor = connection.cursor()
cursor.execute("SELECT isim FROM kitaplar ORDER BY yayim_tarihi DESC LIMIT 10")

for row in cursor.fetchall():
    print "<li>%s</li>" % row[0]

print "</ul>"
print "</body></html>"

İlk olarak CGI gereksinimlerini karşılamak için, "Content-Type" satırı ardından boş satır yazdırılıyor, ardından bir kaç html kodu yazdırılıyor ve veritabanına bağlanıp sorgu çalıştırıldıktan sonra 10 kitap adı alınıyor. Bu kitaplar üzerinde çalışan döngü ile HTML kodlarından liste yaratılıyor. Son olarak HTML kodları kapatılıyor ve veritabanı bağlantısı kapatılıyor.

Bunun giibi birer sayfayı sıfırdan yapmak o kadar da kötü değildir. Bu kod kolayca okunabilir, hatta yeni geliştiriciler bile 16 satır Python kodunu herkes gibi başından sonuna kadar anlayabilir. Öğrenilecek bir şey yoktur, okunacak başka bir kod yoktur. Ayrıca kodun çalıştırılması da kolaydır, sadece ".cgi" uznatısı ile bir dosyaya kaydedilir ve Web sunucusuna upload edilir, ardından sayfa ziyaret edilerek çalıştırılır.

Bu kolaylığa rağmen bir dizi problem ve sinir bozucu durumlar vardır. Kendinize şu soruları sorun:

    • Uygulamanızın birden fazla bölümü veritabanı bağlantısına ihtiyaç duyuyorsa ne olacak? Elbette veritabanı bağlantı fonksiyonu her bir script için sürekli tekrarlanmamalı. En yararlı çözüm paylaşımlı bir fonksiyonda bunu belirlemek olur.
    • Geliştirici "Content-Type" satırını yazmayı ve veritabanı bağlantısını kapatmayı hatırlamalı mı? Bu küçük şeyler programcının verimliliğini düşürüp hatalar yapmasına olanak sağlamaktadır. Bu kurma-yıkma ile alakalı işlemler ortak bir altyapı tarafından halledilmelidir.
    • Eğer kod birden fazla ortamda çalışacaksa ve her veritabanı ve şifre ayrı ayrıysa ne olacak? Bu noktada birkaç ortama-özel ayarlar olmazsa olmaz hale gelmektedir.
    • Python kod deneyimi bulunmayan bir Web Tasarımcısı bu sayfayı tekrar tasarlamak istersen ne olacak? Hatalı bir karakter tüm uygulamanın çakılmasına yol açacaktır. Sayfanın mantığı, kitap başlıklarının veritabanından alınması ve HTML ile bölünmş sayfada yazdırılması, yani tasarımcı ana özelliklere dokunmadan sayfa tasarımını değiştirebilmelidir.

Bu sorunlar Web çatısının çözmeye niyetlendiği sorunlardır. Bir Web çatısı uygulamanıza programlama altyapısı sunar, siz sadece tekeri tekrar icat etmeden, temiz yazmaya ve kodunuza bakım yapmaya odaklanırsınız. Kısaca, Django'nun yaptığı budur.

MVC Tasarım Şablonu

Bir önceki başlıkta ki örnekte verdiğimiz yaklaşımı bir de Web çatısı yaklaşımından vererek farkı gözlemlemizi sağlayan örneğe hızlıca dalış yapalım. CGI kodlarıyla yaptığınız örneği Django ile aşağıdaki gibi yazabilirsiniz. Burada dikkat edeceğiniz ilk unsur programımızı dört Python dosyasına (modeller.py, gorunenler.py, urller.py) ve bir HTML şablonuna (son_kitaplar.html) parçaladık:

# modeller.py (veritabanı tabloları)

from django.db import models

class Kitap(models.Model):
   ad = models.CharField(max_length=50)
   yayim_tarihi = models.DateField()


# gorunusler.py (işin mantığı)

from django.shortcuts import render_to_response
from modeller import Kitap

def son_kitaplar(request):
   kitap_listesi = Kitap.objects.order_by('-pub_date')[:10]
   return render_to_response('son_kitaplar.html', {'kitap_listesi': kitap_listesi})


# urller.py (URL ayarları)

from django.conf.urls.defaults import *
import gorunusler

urlpatterns = patterns('',
   (r'^yeniler/$', gorunusler.son_litaplar),
)


# son_kitaplar.html (şablonumuz)

<html><head><title>Kitaplar</title></head>
<body>
<h1>Kitaplar</h1>
<ul>
{% for kitap in kitap_listesi %}
<li>{{ kitap.ad }}</li>
{% endfor %}
</ul>
</body></html>

Tekrar hatırlatmak gerekirse, programın sözdizimi hakkında merak etmeyin, sadece genel hatlarıyla inceleyin. Burada sizi ilgilendiren kısım, yazılım parçalarıdır:

    • modeller.py dosyası veritabanı tablolarını bir Python sınıfı olarak barındırmaktadır. Bu sınıfa bir model denmektedir. Bu modeli kullanarak, SQL sorguları yerine kolayca ve tamamen Python kodları ile; veritabanınızda yeni kayıt yaratabilir, kayıdı alabilir, güncelleyebilir ve silebilirsiniz.
    • gorunusler.py dosyasi sayfanın mantığını içeren dosyasdır. son_kitaplar() fonksiyona görünen (view) denmektedir.
    • urller.py dosyası URL desenlerine göre hangi görülecek (view) fonksiyonun çağrılacağını barındıran dosyadır. Bu örnekte, /yeniler/ URL'si son_kitaplar() fonksiyonunu çağıracaktır. Diğer bir deyişle: http://example.com/yeniler/ URL'sini açmaya çalışan biri, son_kitaplar() fonksiyonunu çalıştıracaktır (ve fonksiyonun oluşturduğu içeriği görecektir).
    • son_kitaplar.html dosyası sayfanın tasarımını tanımlayan HTML şablonudur. İçerisinde temel mantıksal deyimlerin çalıştırıldığı (örneğin: {% for kitap in kitap_listesi %} gibi) bir şablon dili kullanmaktadır.

Hepsi birlikte Model-View-Controller (MVC [Model-Görünen-Denetleyici]) isimli bir şablonun parçalarını oluşturur. Kolayca anlatmak gerekirse, MVC: arabirimlere ayrılmış (görünen [view]), kullanıcı istemine göre yönlendirilmiş (denetleyici [controller]) kodların, veriyi (modeli) kullanarak çalışmasını sağlayan yazılım geliştirme metoduna denmektedir. (MVC'i 5. Bölümde derinlemesine tartışacağız.)

Bu yaklaşımın ana özelliği bileşenlerin gevşek birleştirildiğidir. Django ile yapılmış Web uygulamalarının her bir parçasının ana bir amacı vardır ve bir parça diğerini etkilemeden çabucak değiştirilebilir. Örnek vermek gerekirse, geliştirici URL yapısında ki bir bölümü, uygulamının hiç bir şekilde iç yapısını bozmayacak şekilde kolayca değiştirebilir. Bir tasarımcı, Python koduna dokunmasına gerek kalmadan sayfanın HTML tasarımını değiştirebilir. Bir veritabanı yöneticisinin, veritabanı tablolarındaki adları değiştirmek istediğinde, yüzlerce dosyada değiştirmek yerine, sadece bir bölümde değiştirmesi yeterlidir.

Bu kitapta (sitede), MVC'nin her bir bileşeninin kendi bölümü bulunmaktadır: 3. Bölüm görünenleri, 4. Bölüm şablonları ve 5. Bölüm modellleri anlatmaktadır.


Django'nun Tarihi

Daha fazla koda dalmadan önce Django'nun tarihini açıklamak için biraz zaman ayırmalıyız. Bunu geçtikten sonra kısayolları tamamen anlamanız için, işleri nasıl kısayolsuz yapacağınız üstünde tekrar duracağız. Django'nun neden yaratıldığını anlamak, Django'nun tarihini anlamaya ve nasıl çalıştığını anlamaya benzerdir.

Eğer bir süredir Web uygulamaları yapıyorsanız, daha önce verdiğimiz CGI örneği size tanıdık gelmiştir. Klasik web geliştiricisinin yolu şöyle bişeydir:

    • Sıfırdan bir Web uygulaması yazımı.
    • Sıfırdan başka bir Web uygulaması yazımı.
    • İlk adımdaki uygulamanın ikinci adımdaki uygulamaya çok benzer olduğunun fark edilmesi.
    • İkinci uygulama ile birinci uygulamanın kodlarının birbirine paylaştırılması.
    • 2. ve 4. adımların bir çok kez tekrar edilmesi.
    • Bir çatının (framework) var olduğunun keşfedilmesi.
    • İşte bu tam olarak Django'nun nasıl oluştuğudur.

Django, Lawrence Kansas USA içerisinde yer alan bir Web geliştirme ekibi tarafından, gerçek-dünya uygulamaları baz alınarak büyümüştür. 2003'ün 3. çeyreğinde, Lawrence Journal-World gazetesinde yazar olan Adrian Holovaty ve Simon Willison'un uygulamalarını geliştirmek için Python kullanmaya başladıklarında Django doğmuştur.

The World Online takımı bir kaç local haber sitesinin bakımından sorumluyken, yazarlıklarının sonlarında bir geliştirme ortamı yaratmayı başardılar. LJWorld.com, Lawrence.com ve KUsports.com dahil olmak üzere, gazetecilik (ve yönetim) özelliğinin istenmesi üzerine, tüm bir uygulama günler ve saatler içerisinde çok hızlı bir şekilde tamamlandı. Böylece, Simon ve Adrian zaman tasarrufu sağlayan Web geliştirme çatılarını ihtiyaçları olmadan da olsa yarattılar. Bu yetiştirme tarihi çok yakın olan projelerin yapılmasının ve bakımını tamamlamanın tek yoluydu.

2005 yazında, geliştirildikten sonra bir çok World Online sitesinin güçlendirildiği çatıyı, Jacob Kaplan-Moss'un da katıldığı takım tarafından açık kaynak kodlu bir yazılım olarak dağıtılma kararı alındı. Temmuz 2005'de, jazz gitaris Django Reinhardt'ın adından esinlenilerek Django ismiyle dağıtıldı.

Bundan bir kaç yıl sonra yani günümüzde Django; evrenin her bir tarafından 10 binlerce kullanıcısı ve katkıcısı olan iyi-kurulmuş bir açık kaynak projesi haline gelmiştir. Orijinal iki World Online geliştiricii ("Hayatın Yardımsever Dikdatörleri," Adrian ve Jacob) hâlâ çatının büyümesi için ana rehberi sağlamaktadır, fakat daha çok takım çalışması ile büyümektedir.

Django'nun tarihi iki püf noktayı açıklamak ile alakalıdır. Bunların ilki Django'nun "tatlı yerleri"dir. Çünkü Django bir haber ortamı olarak doğdu ve sağladığı özelliklerle (örneğin 6. Bölümde ele alacağımız yönetici bölümü gibi), Amazon.com, craiglist.com ve washingtonpost.com gibi veritabanından çalışan "içerik" siteleri için uygun bir hale geldi. Hemen karamsarlığa kapılmayın, çünkü Django özellikle küçük sitelerin de geliştirilmesi için de uygundur ve dinamik bir Web sitesi yapımı için efektiftir. (Diğer şeylerin efektif olmadığı durumlarda, özellikle ve efektif arasında bir fark vardır.)

Django'nun diğer bir püf noktası, açık kaynaklı yazılım camiası tarafından biçimlendiriliyor olmasıdır. Çünkü Django bir akademik örnek veya ticari bir projedense, geliştiricilerinin karşılaştığı ve karşılaşmaya devam ettikleri Web geliştirme problemlerinden, gerçek-dünya kodlarından çıkarılmıştır. Bunun getirdiği bir sonuç olarak, Django günlük işler baz alınarak geliştirilmiştir. Çatı bakıcıları ilgilerini, Django'yu; geliştiricinin zaman kazanması, yük altında uygulamalarını kolayca geliştirip bakımını yapmaları için harcamışlardır. Eğer başka bir durum yoksa, geliştiriciler kendi zamanlarını kullanıp, beklentilerini karşılayarak zevkle işlerini yapmaktadır. (Açıklamak gerekirse, kendi yaptıkları projelerini yeni proje üretmek için kullanmaktadırlar.)



Ceviz Wiki Django Kitabı'nın Türkçe çevirisidir.

The Django Book Copyright 2006, 2007, 2008, 2009 Adrian Holovaty and Jacob Kaplan-Moss.

Django Kitabı Türkçe Çevirisi Copyright 2009 Onur Aslan.

Bu sitede yayımlanan tüm yazılar ve Django Kitabı GNU GFDL lisansı altındadır.