15 Şubat 2014 Cumartesi

URL Yapısı ve Görünümler

Eğer daha önceden Php ile kodlama yaptıysanız düzenli bir url yapısı oluşturabilmek için extradan .htaccess dosyası oluşturmanız gerektiğini bilirsiniz. Bu URL yapısına ise GET ve POST metotları ile ulaşabiliyorsunuz. Php üzerinden devam etmek gerekirse Php ile bir görünüm hazırladıktan sonra bunu sunucu atıp tarayıcı üzerinden direk ulaşabiliyoruz(http://localhost/gorunum.html).
Django'da durum bu işlemlerden biraz daha farklı.Herhangi bir sayfanın görüntülenebilmesi için görünümü hazırlamamız gerekiyor. Hazırlamış olduğumuz bu görünüme ulaşabilmek için adres(URL)e bağlamamız gerekli. Şimdi gelin ilk görünümümüzü hazırlayalım.
Merhaba Django
Merhaba Django görünümünü bir fonksiyon şeklinde hazırlamamız gerekli. Bu fonksiyonu herhangi bir Python dosyası içerisinde yazabilirsiniz. Biz standarttan sapmamak için views.py dosyası içerisinde yazacağız. Tabi ki bu dosyanın projemiz içerisinde olması gerekiyor. Yazdığımız bu fonksiyon "Merhaba Django" metnini yazdıracak.
ilkProjem/views.py
# -*- coding: utf-8 -*-
from django.http import *

def merhaba_django(request):
    return HttpResponse(u'Merhaba Django')  
İlk görünümümüzü oluşturduk. Bu oluşturduğumuz fonksiyon tarayıcıya "Merhaba Django" yazısını gönderecek. Tarayıcıya gönderme işlemini HTTPResponse fonksiyonu yapar.
Oluşturduğumuz bu görünüme URL yapısı ile ulaşacağız. Web tarayıcısına bir adres girdiğimiz zaman hangi fonksiyonun çağrılacağına projeyi oluştururken oluşan urls.py dosyası içerisinde belirteceğiz.
url.py varsayılan olarak şu şekildedir.
from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

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

    url(r'^admin/', include(admin.site.urls)),
)
Gördüğünüz gibi varsayılan bir adres tanımlaması yapılmıştır. Burada adres tanımlaması için kullanılan url fonksiyonu iki parametre alır. İlk parametre tarayıcıdan istenen adresi ikincisi ise bu adres çağrıldığında işletilecek olan fonksiyondur. Eğer tarayıcınızdan http://localhost:8000/admin/ yazarsanız şu şekilde bir görünüm ile karşılaşırsınız.
Projemizi oluştururken Django'nun bizim için oluşturmuş olduğu admin web sayfasına ulaşmış olduk. Şimdi kendi oluşturduğumuz görünüme ulaşalım.
url(r'^merhaba/', views.merhaba_django)
urls.py dosyasında kendi oluşturduğumuz görünümü adres satırı için tanımlamış olduk. Tabi ki bu urls.py dosyası içerisinde views.py dosyasını import etmeyi unutmamamız gerekiyor. Bu kodları yazdıktan sonra urls.py'nin son hali şu şekilde olacaktır.
from django.conf.urls import patterns, include, url
import views

from django.contrib import admin
admin.autodiscover()

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

    url(r'^admin/', include(admin.site.urls)),
    url(r'^merhaba/', views.merhaba_django)
)
Artık adres satırına http://localhost:8000/merhaba yazarak kendi görünümümüze ulaşabiliriz.
Django ile ilk projemizi yapmış olduk.
Dinamik Adresler
Dinamik adres tanımlamaları yaparken Düzenli İfadeler(regular expressions)den yararlanacağız. Eğer düzenli ifadeler hakkında bir fikriniz yoksa Düzenli İfadeler yazılarına bakabilirsiniz.
Elimizde değişken adresler var ve bizim bu adreslere göre görünümlerimiz varsa bu şekilde urller oluşturmamız gerekiyor. Örneğin elimizde şarkıların bulunduğu bir yapı olsun. Şarkıların kendilerine ait kodları olsun.
http://localhost:8000/sarkilar/S01
http://localhost:8000/sarkilar/S02
http://localhost:8000/sarkilar/S03
http://localhost:8000/sarkilar/S04
Eğer biz bu adreslerin hepsini urls.py dosyasına eklemeye kalkarsak işimiz epey zorlaşır. Burada sarkilar kısmı hep sabit fakat şarkı sürekli değişir. Tabi sisteme şarkı eklenip çıkartıldığında bizim de urls.py dosyamızı tekrardan düzenlememiz gerekir. İşte bu tarz zahmetlerden kurtulmak için Düzenli İfadeleri kullanacağız. Şimdi yukarıdaki adres yapımızı oluşturalım.
url(r'^sarkilar/(S[0-9]+)/',views.sarkilar_icerik),
Buradaki [0-9] rakamları sonrasında gelen + operatörü ise 1 ve yada daha fazla sayı olabileceği anlamını taşır. Şimdi views.py içerisindeki sarkilar_icerik fonksiyonumuzu yazalım.
def sarkilar_icerik(request,sarki_kod):
    Sarkilar = {
        u"S01" : (u"Eminem",u"The Monster"),
        u"S02" : (u"Adele", u"Set Fire To The Rain"),
        u"S03" : (u"Enrique Iglesias", u"Heartbeat")
    }
    if sarki_kod in Sarkilar:
        html = u"Şarkı Adı: %s 
 Şarkıcı: %s" %(Sarkilar[sarki_kod][1],Sarkilar[sarki_kod][0])
    else:
        html = u"Aradığınız şarkı bulunamadı"

    return HttpResponse(html)
Eğer tarayıcıda http://localhost:8000/sarkilar/S02 adresini girerseniz şu şekilde bir çıktı alacaksınız.
Şarkı Adı: Set Fire To The Rain 
Şarkıcı: Adele
Kullanıcı olmayan bir kod girerse istediği şarkının olmadığını ona bildirmiştik. Bunu doğrudan bu şekilde yapmak yerine Django bize sağladığı Http404() fonksiyonunu kullanabiliriz. sarkilar_icerik() fonksiyonumuzu şu hale getiriyoruz.
def sarkilar_icerik(request,sarki_kod):
    Sarkilar = {
        u"S01" : (u"Eminem",u"The Monster"),
        u"S02" : (u"Adele", u"Set Fire To The Rain"),
        u"S03" : (u"Enrique Iglesias", u"Heartbeat")
    }
    if sarki_kod in Sarkilar:
        html = u"Şarkı Adı: %s 
 Şarkıcı: %s" %(Sarkilar[sarki_kod][1],Sarkilar[sarki_kod][0])
        return HttpResponse(html)
    else:
        return Http404(u"Aradığınız şarkı bulunamadı")
Kullanıcı olmayan bir şarkı kodu girmeye çalışırsa şu şekilde bir sayfa ile karşılaşır.
İleride kendi hata sayfamızı oluşturup kullanıcıya onu göstermeyi öğreneceğiz.
Adresimizi bu şekilde istediğimiz kadar uzatabiliriz.
http://localhost:8000/kulupler/galatasaray/drogba
http://localhost:8000/kulupler/fenerbahce/emenike
Bu adresleri urls.py dosyamızda şu şekilde tanımlayabiliriz.
url(r'kulupler/(.+)/(.+)',views.kulupler_icerik)
Bu örnekte gördüğümüz gibi adresi istediğimiz kadar uzatabiliyoruz. Burada her / sonrası oluşturduğumuz görünüm fonksiyonuna parametre olarak gönderilir. Yani burada oluşturduğumuz kulupler_icerik fonksiyonumuzun yapısı şu şekilde olacaktır.
def kulupler_icerik(request,kulup,oyuncu)
Şu şekilde oluşturduğumuz tüm adresler kulup_icerik fonksiyonuna yönlendirilir.
http://localhost:8000/kulupler/galatasaray
http://localhost:8000/kulupler/galatasaray/drogba
http://localhost:8000/kulupler/galatasaray/drogba/forvet/N12
http://localhost:8000/kulupler/galatasaray/drogba/forvet
Eğer biz bu şekilde tüm adreslerin yönlendirilmesini istemiyorsak ve adresin http://localhost:8000/kulupler kadar olan kısmının kulupler_icerik fonksiyonuna yönlendirilmesini istiyorsak url() fonksiyonunu şu şekilde düzenlememiz gerekir.
url(r'kulupler/(.+)/$',views.kulupler_icerik)
Burada kullandığımız $ işareti adresin bittiğini belirtir. Tanımlamanın dışındakilere 404 Page not found hatası gönderilir.
Ana Sayfa
Php kullananlar bilirler. Php dosyaları okunmaya başlanırken index.php sayfasından başlanır. Biz şuana kadar birden çok görünüm oluşturduk. Eğer adres çubuğuna http://localhost:8000 yazarsak 404 Page not found hatası alırız. Çünkü henüz anasayfamızı oluşturan fonksiyonu ve url tanımlamasını yapmadık. url tanımlamasını şu şekilde yapacağız:
 url(r'^$',views.ana_sayfa),
Görünüm fonksiyonu:
def ana_sayfa(request):
    return HttpResponse("

Ana Sayfa

")
Artık ana sayfamız da hazır.
Kaynakça

15 yorum :

  1. ben Gösterdiğiniz gibi yaptım enbaştakini lakin böyle bir hata verdi
    Exception Value: name 'dene' is not defined

    YanıtlaSil
  2. Biraz daha ayrıntılı söyleyebilir misiniz? Ne yazdığınız da bu hatayı aldınız?

    YanıtlaSil
  3. Biraz daha ayrıntı resim vereyim
    http://i.hizliresim.com/glAoMZ.jpg
    /admin /merhaba hepsinde hata veriyor.
    http://i.hizliresim.com/P3oMJ6.jpg
    aynı şeyleri ubuntuda yaptım yine hata verdi path ayarlarını yaptım pythonun djangonun.

    YanıtlaSil
  4. Oluşturduğunuz views.py ve urls.py dosyası aynı dizin içerisinde olmadığı için views.py dosyasını bulamıyor ve import edemiyor. Eğer views.py dosyasını urls.py dosyası yanında oluşturursanız hata düzelecektir.

    YanıtlaSil
  5. AttributeError at /
    'module' object has no attribute 'ana_sayfa'

    hatası alıyorum ana sayfa için

    YanıtlaSil
    Yanıtlar
    1. views.py dosyası içerisinde ana_sayfa adında bir metod tanımladığınızdan emin olmalısınız.

      Sil
  6. biraz tuhaf olabilir ama yeni öğreniyorum kusura bakmayın . bunları hep command line mı yazıyoruz

    YanıtlaSil
    Yanıtlar
    1. Hayır. Bunlar bizim py dosyalarımız. Web Server bunları bizim için yorumlayacak ve anlamlandıracaktır.

      Sil
    2. teşekkürler

      Sil
  7. SyntaxError at /sarkilar/S02

    invalid syntax (urls.py, line 14)

    Request Method: GET
    Request URL: http://localhost:8000/sarkilar/S02
    Django Version: 1.8
    Exception Type: SyntaxError
    Exception Value:

    invalid syntax (urls.py, line 14)

    Exception Location: /usr/lib/python2.7/importlib/__init__.py in import_module, line 37
    Python Executable: /usr/bin/python
    Python Version: 2.7.9
    Python Path:

    ['/home/omer/Masa\xc3\xbcst\xc3\xbc/mysite',
    '/usr/lib/python2.7',
    '/usr/lib/python2.7/plat-x86_64-linux-gnu',
    '/usr/lib/python2.7/lib-tk',
    '/usr/lib/python2.7/lib-old',
    '/usr/lib/python2.7/lib-dynload',
    '/usr/local/lib/python2.7/dist-packages',
    '/usr/lib/python2.7/dist-packages',
    '/usr/lib/python2.7/dist-packages/PILcompat',
    '/usr/lib/python2.7/dist-packages/gtk-2.0',
    '/usr/lib/pymodules/python2.7',
    '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']

    Server time: Sun, 9 Aug 2015 15:03:34 +0300

    Nerede bir eksiklik var anlamadım, yardımcı olursanız sevinirim.

    YanıtlaSil
  8. Hocam iyi günler biz bu yaptığımız projeleri hangi editörde yazalım dosyaları tek tek aç kapa sıkıntı böyle Solution Explorer gibi bir yardımcısı yokmu
    İyi Çalışmalar

    YanıtlaSil
    Yanıtlar
    1. Ben PyCharm kullanıyorum. Normalde ücretli bir ide ama öğrenciler için 1 yıllık ücretsiz kullanımı mevcut. Bunun dışında kullanabileceğiniz ideler mevcut. Eclipse vs kullanabilirsiniz. Text editör işimi görür derseniz, Sublime Text, Atom vs kullanabilirsiniz.

      Sil
  9. abi ben şöyle bir hata alıyorum bunun çözümü nedir Unknown command: 'syncdb'
    Type 'manage.py help' for usage.

    abi çözerseniz çok teşekkürler

    YanıtlaSil