25 Eylül 2008 Perşembe

Django'da url ile dans

Ö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'})

Hiç yorum yok:

Yorum Gönder