6 Eylül 2008 Cumartesi

Django Notları - 1

Girizgah


Merhabalar. Bu belge, Django'yu öğrenirken DjangoBook1 sitesinden aldığım, biriktirdiğim notlardan oluşmuştur. Belgenin tamamen kusursuz olduğu veya anlatımının çok iyi olduğu konusunda bir garanti vermiyorum; fakat yine de size yardımcı olabilecek notlar bulabileceğinizi umuyorum. Ayrıca, belge ile ilgili bir yanlışlık veya anlatmamı istediğiniz bir nokta olursa, eposta adresimi kullanarak benimle iletişime geçebilirsiniz:

Not:Django'nun ne olduğu, neden onu seçmemiz gerektiği; bu projenin hangi amaçla ortaya çıkarıldığı ve gelişimi hakkında bilgiler, belgeyi kısa tutmak için verilmemiştir. İnternet zengin bir okyanus :-)

Django'ya Başlamak


Çok değil, Şubat 2007'den beri GNU / Linux kullanıyorum ve onu kullanmaya başlamakla programlamaya ilgim hemen hemen aynı zamanlara denk geliyor. İnternet sitesi tasarımlarına ve programlamasına ilgi duyduğum için ilk olarak PHP'ye yönelmiştim ve hiçbir şekilde framework'un ne anlama geldiğini, ne işe yaradığını çözemememiştim. Hatta bir ara framework ile kastedilen şeyin Wordpress, Joomla ve benzeri şeyler olduğunu zannederdim (belki onlara da framework deniliyor olabilir). İngilizce sözlüğe baktığım zaman karşıma çıkan Türkçe anlamları da beni bir o kadar çıldırtmaya yeterdi: Çatı, çerçeve, web çatısı, web framework.. Yeni başlayan, tecrübesiz kişiler için bu sözcükler gerçekten bir anlam ifade etmiyor.
Sonra, güzel bir deneyim yaşadım. Ben yapacağım her site için tekrar tekrar açıp kodlara bakmak durumunda mıyım? Örneğin, alt tarafı sitenin ana sayfasında bir yazı göstermek için her defasında kodlarla cebelleşmek ne kadar akla mantığa uygundur? Üstelik zaman kavramı da hayatımızın her alanında olduğu gibi, programlamada da son derece önemli, sizce de öyle değil mi? Sıfırdan site yapmak yerine Joomla kuralım, temasını biraz değiştiririz, hazır site kalıbından çıkarmak da çok zor bir şey olmasa gerek hem, öyle değil mi?
Nitekim, nasıl ki kaslarımızı amacı doğrultusunda daha rahat kullanabilmek için kemiklere ihtiyaç duyuyorsak, yapacağımız siteler için de güzel bir altyapıya ihtiyaç duymamız olası, hele ki Python'da. İşte, buna framework deniyor. Düşünün, bir forum veya portal site yapacaksınız. Ama yönetim arayüzü yok :-). Ya da hiç düşünmeyin, hemen Django'yu kullanabilmemiz için neler gerekiyor, ona bakalım.

Django İçin Gerekli Programlar


Kullandığınız dağıtım veya işletim sistemine göre kurulumları değişeceği için, nasıl kurulacağını burada anlatamayacağım. Basit bir araştırma yeter diye umuyorum.
  1. Python
  2. Django
  3. Veritabanı tercihinize göre, Python'a veritabanı desteği:
    • Mysql
    • PostgreSQL
    • Sqlite

Not: Dipnotlarda verilen linkleri kullanmadan önce Paket Yönetici'nizde araştırma yapınız. Tek başlarına çalışmamakla birlikte, birkaç bağımlılığa da ihtiyaç duymaktadırlar. Örneğin python-mysql'in MySQL'a ihtiyaç duyması gibi.

Nihayet Projemizi Başlatıyoruz


Django için gerekli paketler kurulduktan sonra, projenizi barındırabileceğiniz uygun bir dizinde ilk olarak şu komutu veriyoruz:

gkmngrgn ~/programming $ django-admin.py startproject mysite

Böylece mysite dizinimiz ve dizin içinde de proje için gerekli dosyalarımız oluşturulacak:

mysite/
__init__.py
manage.py
settings.py
urls.py


Projemiz ile ilgili yapacağımız tüm işlemler, oluşturduğumuz mysite isimli dizinimizde yapılacak. Diyelim önemli değişiklikler yaptınız ve sitenizi web tarayıcınız ile kontrol etmek istiyorsunuz. O zaman mysite dizinimizde şu komutu vermeniz gerekir:

gkmngrgn ~/programming/mysite $ python manage.py runserver
Validating models...
0 errors found.

Django version 1.0, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.


Evet, komutun çıktısında da görebileceğiniz gibi, sitenizi http://127.0.0.1:8000/ adresinden kontrol edebilirsiniz. İşlemi sonlandırmak için CONTROL-C tuş kombinasyonunu kullanmanız yeterli. İsterseniz, sonraki adıma geçmeden önce bir bakalım, localhost'tan nasıl görünüyor?

ss

Çok tatlı, öyle değil mi? Şimdi proje dizinimizde (mysite) views.py isminde bir dosya oluşturup, örnek olarak şunları yazalım, açıklama satırlarını (en baştaki hariç, diğer "#" ile başlayan satırlar) yazmasanız da olur:

# -*- coding: utf-8 -*-
# Önce Türkçe karakter desteğimiz için utf-8'i yazdık.
# Şimdi gerekli modülleri çağıralım.
from django.http import HttpResponse
import datetime

# Sonra da datetime ile saat & tarih bilgilerini alarak HttpResponse'u döndürelim.
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>Saat ve tarihimizi, python modülü kullanarak yazdırdık: %s.</body></html>" % now
return HttpResponse(html)


Proje dizinimizdeki var olan örnek urls.py dosyasını da şu şekilde değiştirelim:

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

from django.conf.urls.defaults import *

# views.py dosyasında yazdığımız fonksiyonu burada çağırıyoruz.
# ama hangi sayfaya..
from mysite.views import current_datetime

# işte hangi sayfaya olduğunu buradan belirliyoruz.
urlpatterns = patterns('',
(r'^time/$', current_datetime),
)


Bu iki kod hakkında şimdilik sadece http://localhost:8000/time sayfasına, zaman ile ilgili bilgilerimizi yazdırdığımızı söyleyeyim. Dikkat edin, eğer Python dosyalarınızda Türkçe karakter kullanırsanız, kodun başına şunu eklemeyi unutmayın:

# -*- coding: utf-8 -*-
[...]


Hadi, hazır python manage.py runserver komutu yürürlükteyken, bir de şu linke bakalım; http://127.0.0.1:8000/time:
ss
NOT: Saat yanlış mı gösteriyor? settings.py dosyasını açın. TIME_ZONE satırını kendinize göre ayarlayın. Türkiye için:

[...]

# If running in a Windows environment this must be set to the same as your
# system time zone.
TIME_ZONE = 'Europe/Istanbul'

[...]


Bir dahaki yazımızda emeklemeye başlayacağız.. :)

13 yorum:

  1. merhaba, öncelikle linux ve dolayısıyla da python ve django da oldukça yeniyim, burda söylediklerinizi yapıp 127.0.0.1:8000 adresine girdiğimde

    IndentationError at /

    expected an indented block (views.py, line 9)

    Request Method: GET
    Request URL: http://127.0.0.1:8000/
    Exception Type: IndentationError
    Exception Value:

    expected an indented block (views.py, line 9)

    Exception Location: /home/echo/Desktop/mysite/../mysite/urls.py in < module >, line 7
    Python Executable: /usr/bin/python
    Python Version: 2.5.2
    Python Path: ['/home/echo/Desktop/mysite', '/usr/lib/python25.zip', '/usr/lib/python2.5', '/usr/lib/python2.5/plat-linux2', '/usr/lib/python2.5/lib-tk', '/usr/lib/python2.5/lib-dynload', '/usr/local/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages/Numeric', '/usr/lib/python2.5/site-packages/PIL', '/usr/lib/python2.5/site-packages/gst-0.10', '/var/lib/python-support/python2.5', '/usr/lib/python2.5/site-packages/gtk-2.0', '/var/lib/python-support/python2.5/gtk-2.0']

    gibi bir uyarı alıyorum. Neyi yanlış yapıyorum bilmiyorum.
    python 2.5.2 ve django 1.0 yüklü. ayrıca apache 2, mysql, python-mysqldb de yüklü. bunların neden olacağı bir problem olabilir mi?

    cevabınız için şimdiden teşekkürler

    YanıtlaSil
  2. Öncelikle aramıza hoşgeldin diyorum ;)
    Hatana gelmeden önce bir kaç öneri yapayım django ve linuxla çalışırken genelde hata mesajlarını dikkatli okumaya çalış çünkü microsoftta olduğu gibi hata raporu gönder gibi kapalı bir ifade yerine açıkça hatanın ne olduğunu ve nasıl çözebileceğine dair açıklamalar göreceksin.

    Senin sorunda ise ilk 2 satıra bakarsan
    views.py dosyasının 9. satırında birşeylerin ters gittiğini anlarsın. O ters giden şeyde yine 2. satırda "Expected an indented block" ile açıklanmış. Yani 9. satırda senden bir girinti bekliyor. Tahminimce 8. satırda bir döngü ya da bir if kullanmışsın. Pythonda döngülerden, if-else bloklarından,fonksiyonlardan ve sınıflardan sonra her zaman girinti bırakmalısın.

    İyi çalışmalar ;)

    YanıtlaSil
  3. Evet gerçekten de çalıştı, python da girintiler çok önemli dendiğinde bunu dinlemem gerekiyormuş. Ayrıca bu kadar hızlı cevap verdiğiniz için de sizi tebrik ediyorum.

    YanıtlaSil
  4. Merhaba,

    Ben bir türlü çalıştıramadım. Daha doğrusu, Django'yu doğru kurduğumdan bile şüpheliyim...

    Rica, etsem daha detaylı anlatabilir misiniz ?

    Saygılarımla;
    Aras, Samet.

    YanıtlaSil
  5. Merhaba,

    Ben Django ya yeni giriş yapanlardan biriyim.Ve şu konuda takıldım..Manage.py syncdb komutunu verdiğimde sürekli olarak "self" kelimseinde hata veriyor.Ve bu kelimeyi tanımıyor.Bunun nedeni ne olabilir..Yardımcı olursanız çok sevinirim..

    Teşekkürler, iyi çalışmalar...

    YanıtlaSil
  6. self'i bir sınıf > fonksiyon içinde kullanmıyor olabilirsin. kodu görmek lazım.

    YanıtlaSil
  7. def __unicode__(self)
    return self.baslik
    return self.aciklama

    şu sekilde bir sınıf oluşturdugumda self algılanmıyor..normalde rengi değişmesi gerekiyor ..ama olmadı :(

    YanıtlaSil
  8. def __unicode__(self)
    return self.baslik
    return self.aciklama

    şu sekilde bir sınıf oluşturdugumda self algılanmıyor..normalde rengi değişmesi gerekiyor ..ama olmadı :(

    YanıtlaSil
  9. Bu yorum yazar tarafından silindi.

    YanıtlaSil
  10. ImportError at /time

    No module named defaults

    Request Method: GET
    Request URL: http://127.0.0.1:8000/time
    Django Version: 1.8
    Exception Type: ImportError
    Exception Value:

    No module named defaults

    Exception Location: /home/omer/Masaüstü/mysite/mysite/urls.py in , line 3
    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: Sat, 8 Aug 2015 14:01:19 +0000

    YanıtlaSil
  11. @omer cebeci, bu yazı 2008 yılında yazılmış. artık "defaults" diye bir module yok, şurada sorunun çözümü var:
    http://stackoverflow.com/a/19962822

    Kısaca, artık "from django.conf.urls import patterns, url, include" diyerek import etmelisin.

    YanıtlaSil
  12. Cevabınız için teşekkür ederim. Güncel kaynak olarak kullanabileceğimiz bir site önerebilir misiniz?

    YanıtlaSil
    Yanıtlar
    1. Önerebileceğim en iyi kaynak Django'nun kendi sitesi: https://docs.djangoproject.com/en/1.8/

      Yakın zamanda Django İstanbul ekibi, bu belgeleri Türkçe'ye çevirme girişimini başlattı, belki siz de bir ucundan tutup bu topluluğa katkıda bulunmak isteyebilirsiniz. Saygılar.
      http://djangoist.org/

      Sil