Turkish Django Tutorial - Routing, Links, Dynamic Variables on Urls

in #utopian-io9 years ago (edited)

What Will I Learn?

  • Creating urls file for django app
  • Using dynamic numbers or variables on urls
    -- views.py side / data filtering from parameter
    -- urls.py side / using regular expressions
  • Custom url classifications for each django app in django project

Requirements

  • Python 2.7.x
  • Django 1.4.8 or higher

Difficulty

  • Intermediate

Tutorial Contents

This tutorial is about the urls file. In the Urls.py file, create links, dynamically use links with variables, numbers or string variables. Make url definition for each application in Django project.

Curriculum

Django Projesi Tarayıcıdan Gelen İsteği Nasıl İşler?

Urls dosyası oluşturmadan önceden, tarayıcıdan gerçek bir kullanıcının django projemiz için istekte bulunmasında arka tarafta gerçekleşen süreçleri özetleyerek başlayalım.

  • Kullanıcı örnek olarak "www.ornekdjangoprojemiz.com" tarzında alan adina sahip projemizin görüntülenmesi için istekte bulunur.
  • Bu alan adı üzerinde koşan apache benzeri bir web sunucusu gelen isteği cevaplayarak, kurulu olan django projesine isteği yönlendirir.
  • Bu istek ilk olarak django projesinde belirlenen ana kök url dizinine ulaşmak ister. (Genel olarak home yada index olarak tanımlı projemizin ana sayfasının tanımlı olduğu url ve fonksiyon ikilisidir)
  • Django çekirdeği geçerli olan tüm url linkleri üzerinden istek yapılan ile eşleşeni bulmaya çalışır.
  • Eşleşen url linki bulunduğunda bu link için tanımlı olan fonksiyonu içe aktararak gerekli modülü çağırır.
  • Bu fonksiyon her hangi bir Http isteği alan ve sonunda bir html şablon yada cevap hazırlayan bir görev birimidir.
  • Fonksiyon çalışmasını bitirerek kullanıcının istek yaptığı link için web sunucusuna görüntülemesi gereken şablonu cevap olarak döndürür ve kullanıcı istek yaptığı şablona ulaşır.

Urls Dosyası

Örnek birurls dosyası ile başlayalım. İlk olarak django urls kütüphanesinden path birimini kodumuzda kullanabilmek için çağırmamız gerekecek.

from django.urls import path

Daha sonrasında boş bir alan adı girildiğinde cevap verecek olan ana dizin için url'imizi yazalım. ('/' ana dizin olarak kullanılan ifadedir.)

  • Burada istersek eğer aynı fonksiyon için yada aynı şablonu görüntüleyebilmek için birden farklı link (yol) gösterebiliriz. Bu sayede anasayfa fonksiyonumuza birden fazla url aracılığı ile ulaşabilmiş olucaz.
urlpatterns = [
    path('/', views.anasayfa_dizini_fonksiyonu),
    path('utopian-io/dogancankilment', views.anasayfa_dizini_fonksiyonu),
  • Tanımlayacağımız url'lerde (yol yada dizin linkinde) '/' karakteri ile uygulamaya özel linklerimizi özelleştirebiliriz. Örneğin kullanıcı işlemlerinin hepsini "/kullanici-islemleri/" ifadesi ile baslatarak kullanabiliriz. Hemen aşağıdaki kodu inceleyelim beraber.
urlpatterns = [
    path('kullanici-islemleri/giris', views.giris),
    path('kullanici-islemleri/kayit-ol', views.kayit_ol),
    path('kullanici-islemleri/cikis', views.cikis),
    path('kullanici-islemleri/parola-sifirla', views.parola_sifirla),
]

Url üzerinden yakalamak istediğimiz parametre olursa?

Yukarıdaki url tanımlamalarımızda görüldüğü üzere hepsi statik olarak tanımlanmış durumda yani el ile yazarak oluşturduk, peki bir parametre yakalamak isteseydik bunu nasıl gösterecektik hemen anlatalım. Var olan göstermek istediğimiz bilginin sayfaları olsun, bu işlem için sayfa sayılarını küçüktür büyüktür işaretleri arasında yakalayabilicez. <int: sayfa_numarasi> burada;

  • int: Yakalamak istediğimiz değişkenin tipini gösteriyor, bize bir sayı değişkeni olacağını anlatıyor.
  • sayfa_numarasi: parametre olarak gelecek olan değişkenin hangi isimle fonksiyonda kullanılacağı ve geriye döndürüleceğini söylüyor.
    Aşağıdaki kod satırları ile örnekleyelim.
urlpatterns = [
    path('dogancankilment/okudugu-kitap/<int: sayfa_numarasi>', views.kitap_sayfasi_goruntule),
    path('kullanici-yasi/<int: yas>', views.yas_goruntule),
]

Url yazarken path değişkeni yerine django kalıpları kullanmak

Django bizi her seferinde path tanımlamaktan kurtarmak ve biraz daha kalıplaşmış kavramları kullanarak amaçlarımızı genişletmemizi sağlayan ifadeler bulundurmakta. Bunlardan en çok kullanacağımız "patterns" kavramıdır. Bunun için dosyamıza django kütüphaneleri üzerinden eklemeliyiz. Aşağıdaki kod satırlarını dosyamızın başına ekleyelim.

from django.conf.urls import patterns, include, url

Patterns url kalıpları istekleri yada aktarmak istediğimiz verileri bu yolla python fonksiyonlarına iletmek istediğimizde kullanıyoruz. Örnek bir url tanımlamasına bakalım bu ifadeleri kullanarak.

urlpatterns = patterns(",
    url(r'^$', 'uygulama_adimiz.view.anasayfa_fonksiyonu', name = 'anasayfa'),
    url(r'^kullanici-islemleri/', include('kullanici_uygulamasi.urls')),
    url(r'^dogancankilment/', 'uygulama_adimiz.views.isim_goruntule', name='isim_goruntule')
)

Url üzerinden eriştiğimiz fonksiyona parametre yollama

Yukarıda dinamik olarak url kullanımını örnekledik, peki bu dinamik url üzerinden girilen değer, parametre olarak fonksiyonumuza yollansa ve bu parametreye göre filtreleme yapılsa nasıl olur? Hemen bu durumun algoritmik olarak çalışma mantığını örnekleyelim.

  • Elimizde belirli bir kimlik numarasına sahip verilerimiz var,
  • Bu verilerimiz veritabanı tablomuzda "numara" baslikli sütun özelliği ile tutuluyor,
127.0.0.1:8000/ornek-veri/numarasi/1
  • Url'i istek yapıldığında veritabanından ornek veri nesnesine ait 1 kimlik numaralı veriyi bize getirmesini istiyoruz.

Bu yapı için fonksiyonu yazalım.

views.py
from django.http import HttpResponse
def parametre_testi(request, numarasi):
    test_edelim = "Veri icin gelen parametre budur: %s" %numarasi
    return HttpResponse(test_edelim)

Bu fonksiyon ile gelen parametrenin fonksiyon aracılığı ile geriye döndürüldüğünü doğruladık ve testi tamamladık. Şİmdi veritabanı sorgusu ile birleştirerek filtrelemeyi sağlayalım.

def sorgu(request, numara):
    gecerli_veriyi_bul = OrnekVeriSinifi.objects.get(kimlik_numarasi = numara)
    cevap = "Gecerli veri:" + gecerli_veriyi_bul +  " parametre olarak girilen" + numara + " ile" + gecerli_veriyi_bul.kimlik_numarasi + " eşleşmektedir."
    return HttpResponse(cevap)
urls.py

Şimdi yukarıda yazılı olan fonksiyonun doğru çalışabilmesi için dinamik olarak değişken kabul edebilen linki yazalım.

from django.conf.urls import patterns, include, url
urlpatterns = patterns('uygulama_adimiz.views',
   url(r'^test/(\d+)/', 'parametre_testi', name = 'parametre_test_fonksiyonu'),
   url(r'^gecerli-veriyi-bul/(\d+)/', 'sorgu', name = 'sorgu_fonksiyonu'),)

Görmüş olduğunuz üzere düzenli ifadeler kullanarak var olan url linklerimizi dinamik değişken parametreleri alarak çalışabilir hale getirdik. Eğitimimizi tamamlamış bulunmaktayız. Teşekkürler.



Posted on Utopian.io - Rewarding Open Source Contributors

Sort:  

Coin Marketplace

STEEM 0.04
TRX 0.32
JST 0.098
BTC 64478.88
ETH 1879.04
USDT 1.00
SBD 0.38