Son yazımda size
Django’nun kullanım amacı ve mantığı hakkında genel kültür kıvamında bir giriş
yaptım. Bugün Django’da bir projenin nasıl oluşturulduğunu ve bu projenin
içinde gerçekleşen komut trafiğinden bahsedeceğim. Bunlardan bahsederken
Django’nun web için hazırlanmış bir
framework olduğunu bildiğinizi varsayacağım.
Öncelikle
yapacağımız web sayfasının amacını
belirleyelim. Bizim basit bir amacımız olacak. O da kullanıcının girdiği yazıyı aynı sayfada listelemek olsun.
Ubuntu işletim
sisteminde çalışmanızı öneririm çünkü burada gerekli paketleri daha kolay ve
hızlı indirebilirsiniz. Ayrıca windows’tan çok daha dinamik bir yapıya
sahiptir. Terminal aracılığı ile Python 2.7 için Django 1.5 versiyonunu
kurduktan sonra yeni bir proje oluşturabiliriz.
$ django-admin startproject Proj
komutu ile ‘Proj’
isimli bir proje oluşturmuş oluyoruz.
Startproject komutu
ile Django otomatik olarak manage.py ve projenin yapı taşlarını içeren dosya
olmak üzere 2 yapı oluşturuyor. manage.py Django ile iletişime geçmenizi
sağlayan komut aracıdır. Projenin yapı taşlarını içeren ve projemizin adını
taşıyan dosyanın içeriğine baktığımızda 4 farklı Python uzantılı dosya görürüz.
Bu dosyalardan 2’si bizi ilgilendiriyor. settings.py ve urls.py. __init__.py
boş bir dosyadır. Bu dosyanın tek görevi Python'a bu dizinin bir Python
paketi olduğunu bildirmektir. Bu dosyayla işimiz olmayacak şimdilik.
urls.py, tarayıcıya girilen URL’den
hangi uygulamanın kullanacağını gösteren
haritaları içeren dosyadır. settings.py, projenin ayar ve konfigürasyonlarının
yapıldığı dosyadır.
Projemizde görev
alacak uygulamayı, yeni uygulama oluşturma komutu ile projemizin içinde
oluşturabiliriz. Bir projede birden fazla uygulama yer alabilir. Uygulama
oluşturduğumuz anda Django tekrar bize bir taslak oluşturur.
views.py
uygulamalarımızı yazacağımız dosyadır. Burada kullanıcıdan request aldığınızda
sayfadan gelecek cevap belirlenir. models.py dosyasını veri tabanını oluşturmak, verilerimizi nasıl
depolayacağımızı ve verilerin birbirleriyle olan ilişkilerini tanımlamak için
kullanacağız. tests.py, yazdığınız uygulamayı test etmek üzere kullanılan
fonksiyonları içeren dosyadır.
Projemizi oluşturmaya
başlamadan önce ilk yapmamız gereken Django’ya oluşturduğumuz uygulamamızı ve kullanacağımız veri tabanını tanıtmak olacaktır. Bunu Proj/settings.py
dosyasında bulunan INSTALLED_APPS bölümüne uygulamamızın adını ekleyerek
yapabiliriz.
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'App1',
)
Kullanacağımız
veri tabanını tanıtmak için aynı dosya içinde DATABASES alanında ENGINE olarak
sqlite3’ü eklememiz gerekir. Fakat veri tabanının ismini vermek yeterli değildir.
Bilgisayardaki konumunu da bildirmek gerekir ki Django bunu nerede bulacağını
bilsin. Konum bildirmenin en kolay yolu ‘’os’’ (Operating System) modülünden
yararlanıp dosya konumuna ulaşmaktır. Bunu dosyanın en üst satırında aşağıdaki işlemi gerçekleştirerek
yapabiliriz.
import os
BASE_DIR=os.path.dirname(os.path.abspath(__file__))
DATABASE_PATH= os.path.join(BASE_DIR, 'db.sqlite3')
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': DATABASE_PATH,
}
}
Ayarlarımızı yaptıktan
sonra projemizi oluşturmaya başlayabiliriz. Normalde bizim dakikalarca ve bazen
saatlerce yazdığımız kodları bilgisayar saniyeler içinde birbirleriyle ilişki
kurarak çalıştırdığı için işlem sırası diye bir şeyden bahsetmemiz zor olur. Fakat
bir kullanıcının istediği sayfaya gitmek için ilk yapması gereken şeyin
tarayıcıya bir URL girmesi olduğunu biliyoruz. O zaman öncelikle kullanıcının
hangi URL’yi girdiğinde bizim sayfamıza yönlendirileceğini tanımlayalım. URL’den
bahsediyor olmamızdan anlaşılacağı gibi bunu projemizin altında bulunan urls.py
dosyasında yapacağız. Django projemizi
oluşturduğumuz anda bize bir taslak oluşturmuştur. Burada tarayıcıya girilen
URL’nin bize hangi uygulamayı çağıracağını ilişkilendireceğiz. URL yi tanımlarken ‘düzenli ifadeler’ denilen belirli kurallara uyan yazıları belirleyen şablondan yararlanacağız.
url(r’^$’, App1.views.search_gene’) yazarak
oluşturacağımız URL modelinde r- Python’a
tırnak arasındaki string verisini olduğu gibi okuması, herhangi bir
karakteri anlamlandırmaması gerektiğini belirtiyor. Tırnak içerisindeki düzenli
ifade ise ‘^’ işareti ile yazının başını ; ’$’ işareti ile de yazının sonunu
belirtiyor. Yani yazının başı ve sonu arasında karakter olmayacak, boş karakter
tanımlanmıştır. url() fonksiyonunun aldığı ikinci parametre çağıracağı
uygulamadır. Burada App1 uygulaması altında yer alan views.py dosyasında
tanımlanmış search_gene adındaki fonksiyonu hedef olarak gösteriyoruz. urls.py’de haritamızı çizdikten sonra
views.py dosyasında search_gene fonksiyonunu oluşturabiliriz. Faka bundan önce uygulamada kullanacağımız veri modellerini
oluşturmamız gerekir. App1 uygulaması altında yer alan models.py dosyasında
kullanıcının aramasını yapabileceği bir TextField() alanı oluşturalım.
Modellerimizi oluşturduktan sonra views.py sayfasına oluşturduğumuz bu sınıfı
çağırıp kullanıcıdan aldığımız request sonrasında göndermek istediğimiz cevabı
oluşturalım. urls.py sayfasında belirttiğimiz gibi search_gene adındaki fonksiyonu oluşturalım. Bu
fonksiyon “post “ metoduyla gelen sayfadan “gene_code” bölümüne girilen veriyi “genes”
olarak adlandırdığımız değişkene atayacak. Daha sonra bu veriyi “home.html” template’i
üzerinden “items” bölümüne koyarak cevap olarak geri çevirecek. Burada daha
önce Django’ya tanıtmadığımız template dikkatinizi çekmiş olmalı.
Oluşturduğumuz cevabı görselleştiren html dosyalarını template adındaki bir
dosya içinde tutacağız. Bu dosyayı App1
adındaki uygulamamızın içinde oluşturduktan sonra Django’ya template dosyasının
yerini söylememiz gerekir. setting.py dosyasında yer alan TEMPLATE_DIRS bölümünde dosya konumunu
girebiliriz:
TEMPLATE_DIRS = ('/home/Proj/App1/template'
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
)
Cevap gönderirken
kullanacağımız html dosyasında “POST” metodunu kullanan bir form yerleştirmemiz
gerekir. Bu form, kullanıcıdan “gene_code”
adındaki bölme aracılığı ile veri alacağı için adı ’gene_code’ olan input alanı
içermelidir. Cevap aşamasında kullanıcıdan alıdğımız veriyi ekrana yansıtmak
için bu veriyi öncelikle “genes” adındaki değişkene atayıp home.html'de yer alan “items”
a aktaracağız.
Bütün bunları yaparak küçük projemizi oluşturmuş oluruz. Projemizi
çalıştırmak için öncelikle terminal aracılığı ile models.py dosyasında tanımladığımız
veri modellerini senkronize etmemiz
gerekir.
$ python manage.py syncdb
Komutu ile database’ i senkronize edebiliriz.
Burada dikkat etmeniz gereken çok önemli bir nokta var. Modelleriniz bir kere
oluşturduktan sonra burada yapacağınız değişiklikleri senkronize etmek pek
mümkün olmuyor. Yaptığınız değişikliklerin Django tarafından algılanmasını
istiyorsanız
$ python manage.py flush App1
komutu ile bütün veri tabanınızı resetleyip
tekarar senkronize etmeniz gerekir. Bu komut kaydettiğiniz bütün verilerin
silinmesine sebep olacaktır. Bu yüzden proje oluşturma aşamasında veri
modellerinizi güzelce düşündükten sonra tanımlamanız daha verimli olacaktır.
Veritabanını senkronize ettikten sonra
$ python manage.py runserver
Komutu ile sunucumuzu çalıştırıp terminalde
belirtilen linkten sayfamızı açabiliriz.
Django'nun çalışma mantığını daha iyi oturtabilmek için oluşturduğumuz projeyi elimden geldiğince görselleştirmeye çalıştım. Umarım yararlı olmuştur. Bir sonraki yazımda tekrar görüşmek üzere:)