Django url'leri

İlk web sayfamızı yapmak üzereyiz: blogunuzun anasayfası! Ama önce, biraz Django url'lerini öğrenmeye başlayalım.

URL nedir?

URL basitçe bir web adresidir. Bir web sayfasını her ziyaret ettiğinizde bir URL görürsünüz - tarayıcınızın adres barında görünür (evet! 127.0.0.1:8000 bir URL'dir! Ve https://djangogirls.com de bir URL'dir):

Url

Internetteki her sayfanın kendi URL'si olması gerekir. Böylelikle uygulamanız bir kullanıcı URL'ye gittiğinde ne göstermesi gerektiğini bilir. Django'da URLconf (URL konfigürasyonu) denilen birşey kullanıyoruz. URLconf, Django'nun doğru görünümü bulmak için gelen URL'yi eşlemeye çalıştığı kalıplardan oluşur.

URL'ler Django'da nasıl çalışır?

Kod editörümüzde mysite/urls.py dosyasını açalım ve neye benzediğine bakalım:

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    # Examples:
    # url(r'^$', 'mysite.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^admin/', include(admin.site.urls)),
]

Gördüğünüz gibi Django bizim için birşeyler koymuş bile.

# ile başlayan satırlar yorum satırlarıdır - bu satırlar Python tarafından çalıştırılmayacak manasına gelir. Çok pratik, değil mi?

Geçen bölümde gittiğimiz admin URL şimdiden burda:

    url(r'^admin/', include(admin.site.urls)),

admin ile başlayan her URL için Django ona denk gelen bir görünüm bulur manasına gelir. Bu şekilde bir sürü admin URLlerini ekliyoruz böylece hepsi bu küçük dosyanın içinde sıkıştırılmış bir şekilde durmuyor -- bu hali daha okunabilir ve düzenli.

Regex

Django'nun URL'leri görünümlerle nasıl eşleştirdiğini merak ediyor musunuz? Bu kısım biraz karışık. Django bunun için regex kullanıyor. Regex, "regular expressions"ın kısaltılmış hali ve düzenli ifadeler anlamına geliyor. Regex'in bir arama kalıbı oluşturmak için birçok (birçok!) kuralı var. Regexler ileri bir konu olduğu için nasıl çalıştığının detayına girmeyeceğiz.

Gene de kalıpları nasıl oluşturduğumuzu anlamak isterseniz, aşağıdaki bir örnek var - aradığımız kalıbı oluşturmak için kuralların sadece bir kısmına ihtiyacımız olacak, şöyle:

^ metnin başlangıcı için
$ metnin sonu için
\d rakamlar için
+ bir önceki karakterin en az bir kere bulunması gerektiğini belirtmek için
() kalıbın belli bir kısmını yakalamak için

Url tanımındaki diğer herşey birebir eşlenecek.

Şimdi http://www.mysite.com/post/12345/ adresinde bir websitemiz olduğunu düşünelim. 12345 da gönderimizin numarası.

Her gönderi için ayrı bir görünüm yazmak hakkaten can sıkıcı olurdu. Düzenli ifadelerle (regexlerle) url ile eşlecek bir kalıp oluşturup gönderi numarasını çıkartabiliriz: ^post/(\d+)/$. Parçalara bölüp ne yaptığımıza bakalım:

  • ^post/ Django'ya post/ ile başlayan herşeyi almasını söylüyor ( ^)
  • (\d+) ise bir sayı (birden fazla rakam) olduğunu ve bu sayıyı yakalamak ve çıkarmak istediğimizi belirtiyor
  • / ise Django'ya arkasından bir / karakteri gelmesi gerektiğini söylüyor
  • $ ise URL'nin sonuna işaret ediyor, yani sadece sonu / ile biten string'ler bu kalıpla eşleşecek

İlk Django url'niz!

İlk URL'imizi oluşturma zamanı! 'http://127.0.0.1:8000/' adresinin blogumuzun ana sayfası olmasını istiyoruz ve bize bir gönderi listesi göstermesini istiyoruz.

Aynı zamanda mysite/urls.py dosyasını basit tutmak istiyoruz, bunun için ana mysite/urls.py dosyasına blog uygulamamızdan url'leri import edeceğiz (içeri alacağız).

Yorum satırlarını silin (# ile başlayan satırları) ve main url'ye blog.urls satırlarını import edecek (içeri alacak) bir satır ekleyin ('').

mysite/urls.py dosyanız şöyle olmalıdır:

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'', include('blog.urls')),
]

Django artık 'http://127.0.0.1:8000/' adresine gelen herşeyi blog.urls'e yönlendirecek ve oradaki yönergelere bakacak.

Python'da düzenli ifadeler her zaman string'in başına r ekleyerek yapılır. Bu Python için string'in özel karakterler içerdiğini, doğrudan Python için değil düzenli ifadeler için bir string olduğu konusunda ipucu verir.

blog.urls

blog/urls.py adında yeni boş bir dosya oluşturun. Harika! Şu iki satırı ekleyin:

from django.conf.urls import url
from . import views

Burada sadece Django'nun metodlarını ve blog uygulamasındaki tüm görünümleri içeri aktarıyoruz (uygulamamız henüz yok, ama birazdan o kısma da geçeceğiz!)

Bundan sonra ilk URL kalıbımızı ekleyebiliriz:

urlpatterns = [
    url(r'^$', views.post_list, name='post_list'),
]

Gördüğünüz üzere, ^$ URL'sine post_list adında bir view (görünüm) atıyoruz. Bu düzenli ifade ^ (başlangıç) ve $ (bitiş)'e uyan stringlerle eşleşir - yani sadece boş string'lerle eşleşir. Bu doğru çünkü Django URL çözücülerinde 'http://127.0.0.1:8000/' URL'nin parçası değildir. Bu kalıp, Django'ya eğer siteye biri 'http://127.0.0.1:8000/' adresinden gelirse gitmesi gereken yerin views.post_list olduğunu söylüyor.

Son kısım olan name='post_list' görünümü (view'ü) tanımlamak için kullanılan URL'nin adı. Bu görünümün adı ile aynı olabilir ama tamamen farklı birşey de olabilir. İsimlendirilmiş URL'leri (named URLs) projenin ilerleyen kısımlarında kullanacağız, o yüzden uygulamadaki her URL'yi isimlendirmemiz önemli. Aynı zamanda URL isimlerini tekil ve kolay hatırlanabilir yapmamız gerekir.

Herşey tamam mı? Tarayıcınızda http://127.0.0.1:8000/' adresine gidin ve sonuçları görün.

Hata

Artık "It works" demiyor, di mi? Meraklanmayın, sadece bir hata sayfası, korkacak birşey yok! Aslında çok kullanışlılar:

Sayfada gördüğünüz şey: no attribute 'post_list'. Peki post_list size birşey hatırlatıyor mu? Bu görünümüzün ismi! Bu herşey yerli yerinde sadece henüz view'ımız (görünümümüz) yok manasına geliyor. Hiç merak etmeyin, oraya da geleceğiz.

Django URLconfs ile ilgili daha fazla bilgi edinmek istiyorsanız resmi dokümantasyona bakabilirsiniz: https://docs.djangoproject.com/en/1.8/topics/http/urls/