25
Eyl
Önceki yazıda Django ile veritabanı kullanımı örneği yapacağımı yazmıştım ama url adresleri ile oynarken çok eğlenceli şeyler çıktı ortaya yazmadan edemedim.

Önceki örnekteki urlpatterns listemiz aşağıdaki gibiydi;

from deneme.dersler import dersindex, ders1, ders2

urlpatterns = patterns('',
('^$', dersindex),
('bolum1', ders1),
('bolum2', ders2),
)

Buradaki ilk değerin boş olduğunu görüyorsunuz, bu değeri ihtiyaç halinde ön-ek (prefix) olarak kullanabilirsiniz. Şöyle;

from deneme.dersler import *

urlpatterns = patterns('deneme.dersler',
('^$', dersindex),
('bolum1', ders1),
('bolum2', ders2),
)

Peki şöyle bir import yazdıysak?

from deneme.dersler import *
from deneme.makale import *

#Şöyle

urlpatterns = patterns('deneme.dersler',
(r'^$', dersindex),
)

urlpatterns += patterns('deneme.makale',
(r'^$', makaleindex),
)

Bu r'^$' ifadesinde önceki örnekten farklı olarak bir "r" ekledim, bu zorunlu olmasada Python'a bu ifadenin string değil raw olduğunu anlatıyor ve kullanılması iyi olur.

Ayrıca Python'un 255 karakterlik bir fonksiyon arguman limiti var, yani büyük bir sitenin patterns() listesi büyük boyutlara ulaştığında yukarıdaki yöntem kullanılabilir.

Şimdi "/pardus/2008/1" adresini yazacağım pardussurumleri() fonksiyonu ile oluşturmak istiyorum. Bunun için yeni bir pardus.py dosyası açıp şu şekilde yazdım;


# -*- coding: utf-8 -*-

from django.http import HttpResponse

def pardussurumleri(request, version, subversion):
html = "Pardus "+version+"."+subversion
return HttpResponse(html)

Düzenli ifadede olarak kısaca "pardus/", 4 haneli sayı, "/" ve bir haneli sayı tanımı yapıyoruz.

urlpatterns += patterns('deneme.pardus',
(r'^pardus/(\d{4})/(\d{1})/$', pardussurumleri),
)

Peki fonksiyon tanımını şu şekilde yaptığımızı farz edelim;

def pardussurumleri(request, subversion, version):

Bu durumda "/pardus/2008/1" url adresi sonucunda Pardus 1.2008 gibi bir çıktı alırız, ancak aşağıdaki gibi bir pattern tanımı yaparsak fonksiyonumuz pardussurumleri(request, version="2008", subversion="1") olarak çağırılacak.

urlpatterns += patterns('deneme.pardus',
(r'^pardus/(?P<version>\d{4})/(?P<subversion>\d{1})/$', pardussurumleri),
)

Bunun ışığında /pardus20081 url adresi için şöyle bir ifade kullanılabilir.

r'^pardus(?P<version>\d{4})(?P<subversion>\d{1})/$'

Eğer henüz test aşamasındaki bir sürüm için kullanılacak bir url için "/pardus2009test" yerine "/pardus2009" kullanmak istersek pattern ile fonksiyona sabit bir değer geçirebiliriz.

(r'^pardus(?P<version>\d{4})/$', pardussurumleri, {'subversion' : 'test'})
23
Eyl
Bende sonunda eğlenceyi doruklarda yaşamak için Django ile "Selam cümlet-ül alemin" (Hello world) dedim. Linus'un Linux 1.0 duyurusunu yaptığı sıralarda (tabii 2 yıl öncesine kadar bundan haberim yoktu) ben bir Apple makinasındaki GWBasic ile "hello world" yazmanın heyecanını yaşayan bir gençtim. O gün bu gündür ne zaman yeni bir "hello world" yapsam hep aynı heyecanı duyuyorum. Bu arada "hello world yapmak" diye bir deyimi ilk kullanan kişiyim herhalde.

Her neyse, bu yazı öyle geyik bir yazı olmasın bir işe yarasın, diye neler yaptığımı anlatayım.

Django 1.0'ı Pardus'da kurmak için "sudo pisi it Django" komutu veya Paket Yöneticisinden tıklamanız yeterli.

Daha sonra projeler için bir klasör açmanız iyi olur, ben ev dizininde django adında bir klasör açtım, konqueror ile bu dizine girip F4 tuşuna basarak konsolu açın ve ilk projenizi aşağıdaki komut ile oluşturun.

django-admin.py startproject deneme

Django bu komutla deneme adında bir dizin oluşturacak ve proje için gerekli temel dosyaları buraya yazacaktır. Proje henüz boş ancak çalışıp çalışmadığını aşağıdaki komutla hemen test edebilirsiniz.

python manage.py runserver

Bu komutu deneme dizininde vermelisiniz, çünkü manage.py orada. Komut çıktısından anlayacağınız gibi tarayıcınızın http://127.0.0.1:8000 adresinden projenizi görüntüleyebilirsiniz. Kocaman bir "It worked" yazısı görmüş olmalısınız. Evet şimdi kendi kodlarımızı yazalım;

deneme Dizini altında "dersler.py" adında bir dosya oluşturun, içeriği şöyle;


# -*- coding: utf-8 -*-
#Üst satır Türkçe karakterler için

#Django kütüphanesinden bir işlev ekliyoruz
from django.http import HttpResponse


#Bu fonksiyon sitemizin indeks sayfasını oluşturacak
def dersindex(request):
html = "<a href='bolum1'>Bölüm 1</a><br>"
html += "<a href='bolum2'>Bölüm 2</a><br>"
return HttpResponse(html)


#Bu fonksiyon da başka bir sayfa
def ders1(request):
msg = "Django mu? o da ne?"
return HttpResponse(msg)



#Bir başkası
def ders2(request):
msg = "Django Reinhardt ünlü bir gitaristtir."
return HttpResponse(msg)


Bu üç fonksiyonun ortak özelliklerine dikkat edin, parametre olarak "request" alıyorlar ve HttpResponse ile değer döndürüyorlar. Buradaki her bir forksiyonun yaptığı sadece sayfanın içeriğni oluşturmak. dersindex Fonksiyonunudaki HTML kodlarına bakarsanız /bolum1 ve /bolum2 dizinlerine bağlantı verildiğini görüyorsunuz, ancak projemizde böyle bir dizin açmadık, şimdi anladığınız üzere ders1 ve ders2 diye iki fonksiyonumuz var ve bu url adreslerini bu fonksiyonlara bağlamamız gerekiyor. Bunu da Django'nun oluşturduğu urls.py dosyasından yapıyoruz. Bu dosyayı şöyle düzenledim;


# -*- coding: utf-8 -*-
#Bunu ben ekledim

from django.conf.urls.defaults import *

#Bunu da ben ekledim, yazdığımız fonksiyonları projeye ekliyoruz
from deneme.dersler import dersindex, ders1, ders2

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()


urlpatterns = patterns( '',
('^$', dersindex),
('bolum1', ders1),
('bolum2', ders2),
)


Böylece patterns fonksiyonundaki parametreler ile sitemizin /bolum1 adresi çağırıldığında ders1 forksiyonunun çalışmasını sağlamış oluyoruz. Bu url adreslerinde '^$' gibi düzenli ifadeler kullanılabiliyor, bunula ilgili http://pythontr.blogspot.com/2008/09/dzenli-ifadelelerde-kullanlan.html adresinden bilgi alabilirsiniz.

Merak etmeyin Django ile veritabanı kullanmak en az bu örnek kadar basit :) Bir sonraki örnekte ona bakarız.