28 Şubat 2014 Cuma

Filtreler

Django,şablonları içerisinde filtreler kullanmamıza olanak sağlar.
###Kullanımı###
{{ baglam_degiskeni|filtre:filtre_argumani}}
add
Şablon değişkenlerini toplamamızı sağlar.
s = template.Context({"sayi1":5,"sayi2":10})
b = template.Template('Sayıların toplamı:{{ sayi1|add:sayi2 }}');
print b.render(s)
###Çıktı###
Sayıların toplamı:15
capfirst,title
capfirst cümlenin ilk harfini büyük yapmak için kullanılır. title ise girilen cümlediki tüm kelimelerin ilk harflerini büyük yapar.
s = template.Context({"cumle":"sakarya üniversitesi bilgisayar mühendisliği"})
b = template.Template('{{ cumle|capfirst }}');
print b.render(s)
###Çıktı###
Sakarya üniversitesi bilgisayar mühendisliği
s = template.Context({"cumle":"sakarya üniversitesi bilgisayar mühendisliği"})
b = template.Template('{{ cumle|title }}');
print b.render(s)
###Çıktı###
Sakarya Üniversitesi Bilgisayar Mühendisliği
addslashes
' işaretlerinden önce kaçış dizisi koymaya yarar.
s = template.Context({"cumle":"Sakarya'nin merkez'i Adapazarıdır"})
b = template.Template('{{ cumle|addslashes }}');
###Çıktı###
Sakarya\'nin merkez\'i Adapazarıdır
join
Liste elemanlarını istediğimiz karakter ile birleştirmemizi sağlar.
programlama = ["Python","Java","C++","Php"]

s = template.Context({"programlama":programlama})
b = template.Template('{{ programlama|join:"
  • " }}'); print b.render(s ###Çıktı### Python
  • Java
  • C++
  • Php
  • cut
    Kesme işlemi yapar herhangi bir karakter kümesini cümleden çıkartmamızı sağlar.
    s = template.Context({"programlama":"Programalama şimdinin ve geleceğin mesleğidir."})
    b = template.Template('{{ programlama|cut:" "}}');
    print b.render(s)
    ###Çıktı###
    Programalamaşimdininvegeleceğinmesleğidir.
    
    default
    Bağlam değişkenin değeri false(herhangi bir atama yapılmadığı durum) dönüyorsa ön tanımlı olarak değer atamamızı sağlar.
    s = template.Context({"index":""})
    b = template.Template('{{ index|default:1}}');
    print b.render(s)
    ###Çıktı###
    1
    
    dictsort
    Liste'yi sıralamamızı yapmamızı sağlar.
    ogrenciler = [
     {'isim':'Uygar','yas':21},
     {'isim':'Mazlum','yas':20},
     {'isim':'Okan','yas':21}
    ]
    
    b = template.Template('{{ogr|dictsort:"isim"}}');
    s=template.Context({'ogr':ogrenciler})
    print b.render(s)
    ###Çıktı###
    ogrenciler = [
     {'isim':'Mazlum','yas':20},
     {'isim':'Okan','yas':21},
     {'isim':'Uygar','yas':21}
    ]
    
    leghth
    Listenin uzunluğunu verir.
    program = ["Python","PHP","Java","C++"]
    
    b = template.Template('Listede {{program|length}} programlama dili yer almaktadır.');
    s=template.Context({'program':program})
    print b.render(s)
    ###Çıktı###
    Listede 4 programlama dili yer almaktadır.
    
    first
    Listenin ilk elemanını verir.
    program = ["Python","PHP","Java","C++"]
    
    b = template.Template('Öğreneceğimiz ilk programlama dili: {{program|first}}');
    s=template.Context({'program':program})
    print b.render(s)
    ###Çıktı###
    Öğreneceğimiz ilk programlama dili: Python
    
    lower,upper
    Cümlenin tüm karakterlerini büyük(upper) veya küçük(lower) yapmamızı sağlar.
    b = template.Template('Öğreneceğimiz ilk programlama dili: {{program.0|upper}}');
    ###Çıktı###
    Öğreneceğimiz ilk programlama dili: PYTHON
    b = template.Template('Öğreneceğimiz ilk programlama dili: {{program.0|lower}}');
    ###Çıktı###
    Öğreneceğimiz ilk programlama dili: python
    
    random
    Listeden rastgele bir eleman seçmemizi sağlar.
    b = template.Template('Bugün ki programlama dilimiz: {{program|random}}');
    ###Çıktı###
    Bugün ki programlama dilimiz: PHP
    
    removetags
    HTML etiketlerini silmemizi sağlar.
    b = template.Template('{{HTML|removetags:"span"}}');
    s=template.Context({'HTML':'
    pythondersleri.com ücretsiz eğitim verir.
    '}) print b.render(s) ##Çıktı###
    pythondersleri.com ücretsiz eğitim verir.
    time
    datetime biçiminde zamanları göstermek için kullanılır.
    b = template.Template('{{zaman|time:""}}');
    s=template.Context({'zaman':datetime.datetime.now()})
    print b.render(s)
    ###Çıktı###
    2:28 a.m.
    
    unordered_list
    Listelerden HTML listesi oluşturmayı sağlar. Çok faydalı bir filtredir.
    b = template.Template('
      \n{{dersler|unordered_list}}\n
    '); s=template.Context({'dersler':['Bilgisayar Mühendisliği',['Algoritma','Sistem Programlama','Veri Yapıları']]}) print b.render(s) ###Çıktı###
    • Bilgisayar Mühendisliği
      • Algoritma
      • Sistem Programlama
      • Veri Yapıları
    urlize
    Adresleri url biçimine dönüştürmemizi sağlar. İşimizi çok kolaylaştırır. Gerçekten çok iyi bir filtredir.
    b = template.Template('{{pythondersleri|urlize}}');
    s=template.Context({'pythondersleri':"www.pythondersleri.com ücretsiz ders vermektedir. İletişim için mehmet@mehmetince.net"})
    print b.render(s)
    ###Çıktı###
    www.pythondersleri.com ücretsiz ders vermektedir.
    İletişim için mehmet@mehmetince.net
    

    Kaynakça

    25 Şubat 2014 Salı

    Etiketler

    Şimdiye kadar şablonlar içerinde sadece aktardığımız verilere ulaştık. Bunun dışında şablonlar içerisinde programlama etiketlerini kullanabiliriz.








    if/else Etiketi
    ##Kullanımı
    {% if kontrol %}
    ....
    {% else %}
    ....
    {% endif %}
    
    Burada dikkat etmemiz gereken açtığımız etiketi end ifadesi ile sonlandırıyor olmamızdır. Bunu tüm etiketlerde yapmak zorundayız.
    s = template.Template('{{uye.adi}} isimli üyemiz {% if uye.bagis %} bağış yapmıştır. {% else %} bağış yapmamıştır {% endif %}');
    b= template.Context({"uye":{"adi":"Muratcan","bagis":True}})
    print s.render(b)
    
    ###Çıktı###
    Muratcan isimle üyemiz  bağış yapmıştır. 
    
    if etiketinde kullandığımız nesneler eğer boş ise False döner. Aynı örneği şu şekilde değiştirelim.
    b= template.Context({"uye":{"adi":"Muratcan"}})
    print s.render(b)
    ###Çıktı###
    Muratcan isimli üyemiz  bağış yapmamıştır
    
    İç içe istediğimiz kadar if/else etiketleri kullanabiliriz.
    s = template.Template('''
    {{ ogr.adi }}'nın Programlama Harf Notu
    {% if ogr.not > 60 %} BB
    {% elif ogr.not > 70 %} BA
    {% elif ogr.not > 80 %} AA
    {% else %} FF
    {% endif %}
    ''');
    b= template.Context({"ogr":{"adi":"Muratcan","not":75}})
    print s.render(b)
    ###Çıktı###
    Muratcan'nın Programlama Harf Notu
    BB
    
    Programı şu hale getirelim. Hem iç içe if/else kullanmış olalım. Hemde birden fazla öğrenci için tekrarlamış olalım.
    ogr_liste = ({"adi":"Muratcan","not":75},{"adi":"Miran","not":30})
    
    s = template.Template('''
    {{ ogr.adi }}'nın Programlama Harf Notu
    {% if ogr.not > 40 %}
     {% if ogr.not > 60 %} BB
     {% elif ogr.not > 70 %} BA
     {% elif ogr.not > 80 %} AA
     {% endif %}
    {% else %}
      FF dersten kaldı.
    {% endif %}
    ''');
    for i in ogr_liste:
     b= template.Context({"ogr":i})
     print s.render(b)
    ###Çıktı###
    Muratcan'nın Programlama Harf Notu
      BB
    Miran'nın Programlama Harf Notu
      FF dersten kaldı.
    
    Karşılaştırma İşleçleri
    Önceki örneklerde kullandığımız > işleci bunlardan birisidir. Programlama da kullandığımız işleçlerden hiç bir farkı yoktur.
    == işleci (Eşitlik) ve != işleci (Eşit değil)
    İki ifadenin eşit olduğu durumlarda çalışır.
    b = template.Template('''{{personel.adi}}'nın maaşı
    {% if personel.ucret == 1000 %}
    1000 TL
    {% endif %}
    ''')
    s= template.Context({"personel":{"adi":"Ali","ucret":1000}})
    print b.render(s)
    ###Çıktı###
    Ali'nın maaşı
    1000 TL
    
    != işleci iki ifadenin eşit olmadığı durumda çalışır.
    >işleci (Büyük) ve >= işleci (Büyük eşitti)
    Matematikteki büyüktür işareti gibidir. > işlecinin solundaki ifade sağındaki ifadeden büyük ise çalışır.
    b = template.Template('''{{personel.adi}}'nın maaşı
    {% if personel.ucret > 1000 %}
    1000 TL'den fazla.
    {% endif %}
    ''')
    s= template.Context({"personel":{"adi":"Ali","ucret":1200}})
    print b.render(s)
    ###Çıktı###
    Ali'nın maaşı
    1000 TL'den fazla.
    
    >= işleci eşitlik durumunda da çalışır.
    < işleci (Küçük) ve <= işleci (Küçük eşittir)
    > işlecinin tam tersi durumlarda işlem yapar.
    in (İçinde) ve not in (İçinde değil)
    in aradığımız liste gibi bir ifadenin içerisinde var ise çalışır.
    b = template.Template('''
    {% if "Futbol" in personel.sporlar %}
     Personel Futbol oynuyor.
    {% endif %}
    ''')
    s= template.Context({"personel":{"adi":"Ali","ucret":1200,"sporlar":["Futbol","Basketbol"]}})
    print b.render(s)
    ###Çıktı###
    Personel Futbol oynuyor.
    
    Operatörler
    Karşılaştırma yaparken and,or,and not gibi operatörleri kullanabilirsiniz.
    b = template.Template('''
    {% if bilgisayar.fiyat < 2000 and bilgisayar.fiyat > 1500 %}
    Bilgisayarın fiyat aralığı normal.
    {% endif %}
    ''')
    s= template.Context({"bilgisayar":{"markası":"Samsung","fiyat":1600}})
    print b.render(s)
    ###Çıktı###
    Bilgisayarın fiyat aralığı normal.
    
    ifequal/ifnotequal Etiketi
    İki değeri karşılaştırmak için kullanılır.
    ###Kullanımı
    {% ifequal deger1 deger2 %}
    ...
    {% endifequal %}
    
    Öğrenci adını kıyaslayan bir uygulama yapalım.
    b = template.Template('''
    {% ifequal ogr.adi "Ali" %}
    Hoşgeldin Ali
    {% endifequal %}
    ''')
    s= template.Context({"ogr":{"adi":"Ali"}})
    print b.render(s)
    
    Bu etiket yerine == (Eşitlik) işlecini kullanabiliriz.
    for Etiketi
    Şablon içerisinde kullanabileceğimiz tek döngü for döngüsüdür. Python derslerinden hatırlarsanız iterasyon işlemleri için bu döngüyü kullanıyorduk.
    ##Kullanımı
    {% for %}
    ...
    {% endfor %}
    
    Alış veriş listesi adında bir uygulama yaparak kullanımını gösterelim.
    alisveris_listesi = ["Elma","Armut","Makarna","Pirinç","Salça"]
    Alışverişte alınacaklar:
    b = template.Template('''
    {% for i in liste %}
    {{ i }}
    {% endfor %}
    ''')
    s= template.Context({"liste":alisveris_listesi})
    print b.render(s)
    ###Çıktı###
    Alışverişte alınacaklar:
    Elma 
    Armut 
    Makarna 
    Pirinç 
    Salça 
    
    Şimdi bu tarz bir örneği HTML etiketleri ile kullanalım.
    spor = ["Futbol","Basketbol","Hentbol","Voleybol"]
    
    b = template.Template('''
    

    Spor Çeşitleri:

      {% for i in liste %}
    • {{ i }}
    • {% endfor %}
    ''') s= template.Context({"liste":spor}) print b.render(s) ###Çıktı###

    Spor Çeşitleri:

    • Futbol
    • Basketbol
    • Hentbol
    • Voleybol
    Sitemizde kullanabileceğimiz bir liste elde etmiş olduk.
    for Döngüsünün Bazı özellikleri
    forloop.counter ile sayaç indislerini alabiliriz. Alışveriş listesi örneğini şu şekilde değiştirelim.
    b = template.Template('''
    

    Alışverişte alınacaklar:

    {% for i in liste %} {{ forloop.counter }}.{{ i }} {% endfor %} ''') ###Çıktı### 1.Elma 2.Armut 3.Makarna 4.Pirinç 5.Salça
    Burada indis 1'den başlamıştır. Eğer 0'dan başlamasını istersek forloop.counter0 ifadesini kullanabilirsiniz.
    b = template.Template('''
    

    Alışverişte alınacaklar:

    {% for i in liste %} {{ forloop.counter0 }}.{{ i }} {% endfor %} ''') ###Çıktı### 0.Elma 1.Armut 2.Makarna 3.Pirinç 4.Salça
    Sayacı tersten başlatmak istersekforloop.revcounter ifadesini kullanabiliriz.
    b = template.Template('''
    

    Alışverişte alınacaklar:

    {% for i in liste %} {{ forloop.revcounter }}.{{ i }} {% endfor %} ''') ###Çıktı### 5.Elma 4.Armut 3.Makarna 2.Pirinç 1.Salça
    Eğer sayacın 0'da sonlanmasını istiyorsanız forloop.revcounter0 ifadesini kullanabilirsiniz.
    Döngü işlemi yaparken döngünün başlangıcını ve sonunu bilmek istiyorsak forloop.first ve forloop.last ifadelerini kullanabiliriz.
    b = template.Template('''
    

    Alışverişte alınacaklar:

    {% for i in liste %} {% if forloop.first %}
  • {% elif forloop.last%}
  • {% else %}
  • {% endif %}{{ i }}
  • {% endfor %} ''') ###Çıktı###

    Alışverişte alınacaklar:

  • Elma
  • Armut
  • Makarna
  • Pirinç
  • Salça
  • Döngü içerisinde ilk ve son elemanları yakalayarak özel sınıf atamaları yaptık.
    Yorumlar
    Şablonlar içerisine yorum satırları ekleyebiliriz.
    {# Burası tek satır yorum eklemek için #}
    
    {% comment %}
    Burası birden fazla
    satır yorum eklemek için
    {% endcomment %}
    
    Kaynakça:

    24 Şubat 2014 Pazartesi

    Sosyal mühendislik saldırıları için başlangıç noktası kuruma ait e-posta adreslerinin bulunmasıdır. Bunun için farklı yöntemler kullanılmaktadır. Özellikle bir çok kurum internet sayfalarında kuruma ait e-posta adreslerini yayınlamaktadırlar. El ile kuruma ait e-posta adreslerinin çıkartılması mümkün olmamaktadır. Bu işlem otomatize bir şekilde herhangi bir programlama dili ile gerçekleştirilebilir.


    Bu işlemi python ile gerçekleştirmek için aşağıdaki kod kullanılabilir.

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    
    __VERSION__ = '0.1'
    __AUTHOR__ = 'Galkan'
    __DATE__ = '30.10.2013'
    
    
    try:
          import urllib2
          import sys
          import re
          import random
          import argparse
          import time
    except ImportError,err:
          import sys 
          sys.stdout.write("%s\n" %err)
          sys.exit(1)
    
    
    
    class Crawl:
    
     def __init__(self, url_opt, mail_opt, time = 0):
    
      self.HEADERS = {
       'User-Agent': 'Mozilla/5.0',
       'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
       'Accept-Encoding': 'gzip, deflate',
       'Connection': 'close',
       'DNT': '1'
      }
    
      self.UAS = [
       'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',
       'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0',
       'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.17 (KHTML, like Gecko) Version/6.0.2 Safari/536.26.17',
       'Mozilla/5.0 (Linux; U; Android 2.2; fr-fr; Desire_A8181 Build/FRF91) App3leWebKit/53.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1',
       'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts; .NET CLR 1.1.4322; PeoplePal 6.2)',
       'Mozilla/5.0 (Windows NT 5.1; rv:13.0) Gecko/20100101 Firefox/13.0.1',
       'Opera/9.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.01',
       'Mozilla/5.0 (Windows NT 5.1; rv:5.0.1) Gecko/20100101 Firefox/5.0.1',
       'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 3.5.30729)'
          ]
    
      self.time = time
      self.url_opt = url_opt
      self.mail_opt = mail_opt
    
      self.url_reg = re.compile("href\s*=\s*\"([^\"]+)\"")
      if not self.mail_opt == "all":
       self.email_reg = re.compile("[\d\w\-\_\.]+@%s"% (self.mail_opt))
      else:
       self.email_reg = re.compile("[\d\w\-\_\.]+@[\d\w\-\_\.]+")
      self.site_reg = re.compile("(https?|ftp://)|(javascript|mailto)")
    
    
     def crawl(self, html):
      
      ret_list = []
      for node in html:
       if re.findall(self.url_reg, node):
        resp = re.findall(self.url_reg, node)
        for elem in resp:
         if not re.match(self.site_reg, elem):
          if not elem in ret_list:
           ret_list.append(elem)
    
      return ret_list
    
    
     def extract_email(self, html):
    
      email_res = []
      for node in html:
       if re.findall(self.email_reg, node):
        email = re.findall(self.email_reg, node)
        for node in email:
         if node not in email_res:
          email_res.append(node)
    
      return email_res
    
    
     def get_webpage(self, url):
     
      html = None  
    
      request = urllib2.Request(url)
      self.HEADERS['User-Agent'] = random.choice(self.UAS)
      request.add_header('User-Agent', self.HEADERS)
    
      response = urllib2.urlopen(request)
                    html = response.readlines()
    
      return html
    
    
     def main(self, url):
    
      hostname = url.split("/")[2]
      html = self.get_webpage(url)
    
      if not html == None:
       if self.url_opt == "url":
        response_list = self.extract_email(html) 
        for node in response_list:
         print node
       elif self.url_opt == "url-all":
        crawled_url = self.crawl(html)
        for url in crawled_url:
         new_url = ""
         if not re.match("/", url):
          new_url = "http://" + hostname + "/" + url
         else:
          new_url = "http://" + hostname + url
    
        email_list = []
        for url in crawled_url:
         new_url = ""
         if not re.match("/", url):
          new_url = "http://" + hostname + "/" + url
         else:
          new_url = "http://" + hostname + url
    
         html = self.get_webpage(new_url)
         response_list = self.extract_email(html)
         
         for node in response_list:
          if node and node not in email_list:
           email_list.append(node)
    
         if not self.time == 0:
          sleep_time = random.randint(1,int(self.time))
          time.sleep(sleep_time)
    
        for email_res in email_list:
         print email_res
    
      else:
       print "Error, Gettig Html Web Page !!!"
       sys.exit(3)
    
    
    ##
    ### Main ...
    ##
    
    if __name__ == "__main__":
    
     parser = argparse.ArgumentParser(description='Email Crawler From Web Sites')
            g = parser.add_mutually_exclusive_group(required=True)
    
            g.add_argument('--url', dest='url', action='store_const', const='url', help="Only this url")
            g.add_argument('--url-all', dest='url', action='store_const', const='url-all', help="All the urls discovered")
     
     parser.add_argument('options', nargs=1)
     parser.add_argument('--mail', dest='mail', help="Email", required = True)
     parser.add_argument('--time', dest='time', help="Random Sleep Time")
     args = parser.parse_args()
    
     if not re.match("https?://",args.options[0]):
      print >> sys.stderr , "Url:  \"%s\"   must start with http(s) pattern !!!"% (args.options[0])
      sys.exit(2)
    
     if args.time:
      crawl = Crawl(args.url, args.mail, args.time)
     else:
      crawl = Crawl(args.url, args.mail, 0)
     crawl.main(args.options[0])

    # ./mail-crawl.py --url-all http://www.fotomac.com.tr/ --mail fotomac.com
    oaslan@fotomac.com
    ismail.ozturk@fotomac.com
    adnan.aybaba@fotomac.com
    aliihsan.saricoban@fotomac.com
    spor@fotomac.com
    ayhan.akbin@fotomac.com
    bulent.can@fotomac.com

    23 Şubat 2014 Pazar

    Django Şablonları

    Django şablonlarının kullanmaya başlayabiliriz.









    Örnek üzerinden açıklamaya başlayalım.
    # -*- coding: utf-8 -*-
    
    from django import template
    
    s = template.Template("Takım Adı:{{adi}}")
    b = template.Context({"adi":"Galatasaray"})
    print s.render(b)
    
    Bu kod parçasını çalıştırmaya çalışırsanız şu şekilde bir hata ile karşılaşabilirsiniz.
    Traceback (most recent call last):
      File "/home/mazlumagar/Django/mysite/sablonn.py", line 7, in 
        b = template.Template("Takım Adı:{{adi}}")
      File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 123, in __init__
        if settings.TEMPLATE_DEBUG and origin is None:
      File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 54, in __getattr__
        self._setup(name)
      File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 47, in _setup
        % (desc, ENVIRONMENT_VARIABLE))
    django.core.exceptions.ImproperlyConfigured: Requested setting TEMPLATE_DEBUG, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
    
    Bu hatadan kurtulabilmek için konfigürasyon işlemini yapmamız gerekiyor. Bunun için 2 satır kod ekleyeceğiz ve programımızın son durumu şu şekilde olacak.
    # -*- coding: utf-8 -*-
    
    from django import template
    from django.conf import settings
    
    settings.configure(DEBUG=True,Template_DEBUG=True)
    
    s = template.Template("Takım Adı:{{adi}}")
    b = template.Context({"adi":"Galatasaray"})
    print s.render(b)
    
    Burada s nesnesine şablon, b nesnesine bağlam denir. Bağlamlar içerisinde {{ }} arasındaki değişkenlere bağlam değişkeni denir. s.render(b) işlemine ise s şablonun b bağlamı ile yorumlanması diyoruz. İsterseniz s nesnemizi yazdıralım ve sonucunu görelim.
    s = template.Template("Takım Adı:{{adi}}")
    b = template.Context({"adi":"Galatasaray"})
    print s
    
    
    template tipinde bir nesne olduğunu görebilirsiniz.
    Bir şablon nesnesini istediğimiz kadar şablon ile yorumlayabiliriz.
    s = template.Template("Takım Adı:{{adi}}")
    takimlar = ["Galatasaray","Fenerbahçe","Beşiktaş"]
    for i in takimlar:
        b = template.Context({'adi':i})
        print s.render(b)
    Takım Adı:Galatasaray
    Takım Adı:Fenerbahçe
    Takım Adı:Beşiktaş
    
    Bağlama Değer Gönderme
    Şablona veri aktarırken sözlük kullandığımızı fark etmişsinizdir. Şuana kadar gönderdiğimiz sözlükler hep basit haldeydi. Eğer istersek sözlük anahtarlarının değerlerini sözlük,liste gibi veri yapıları da yapabiliriz.
    ogrenci = {"isim":"Ahmet Yapıcı","bolum":"Bilgisayar Mühendisliği"}
    s = template.Template("{{ogrenci.isim}} isimli öğrenci {{ogrenci.bolum}} bölümünde okuyor")
    b = template.Context({"ogrenci":ogrenci})
    print s.render(b)
    Ahmet Yapıcı isimli öğrenci Bilgisayar Mühendisliği bölümünde okuyor
    
    Gördüğünüz gibi gönderdiğimiz sözlük içindeki ogrenci anahtarının değerini başka bir sözlük olarak tanımladık. Burada dikkat etmeniz gereken en önemli şey gönderdiğimiz sözlük değeri içerisindeki elemanlara ulaşırken ogrenci[adi] şeklinde değilde ogrenci.adi şeklinde kullandık. Aynı şekilde değer olarak bir liste de kullanabiliriz.
    bolumler = ["Bilgisayar","Makina","Mekatronik"]
    s = template.Template("Sakarya Üniversitesinde {{ bolum.0 }} , {{ bolum.1 }} , {{ bolum.2 }} gibi mühendislikler bulunur.")
    b = template.Context({"bolum":bolumler})
    print s.render(b)
    Sakarya Üniversitesinde Bilgisayar , Makina , Mekatronik gibi mühendislikler bulunur.
    
    Aynı mantıkla liste elemanlarına ulaşırken bolum[index] yerine bolum.index yazım biçimini kullandık.
    Şimdi sözlük ve listeyi bir arada kullanabileceğimiz bir örnek yapalım.
    takimlar = ['Galatasaray','Fenerbahçe','Beşiktaş']
    oyuncu = {"adi":"Wesley Sneijder","yasi":27}
    oyuncu2 = {"adi":"Tolga Zengin","yasi":30}
    
    oyuncular = {"takimlar":takimlar,"oyuncu":[oyuncu,oyuncu2]}
    
    s = template.Template("{{ oyuncular.oyuncu.0.yasi }} yaşındaki {{ oyuncular.oyuncu.0.adi }} {{oyuncular.takimlar.0}}'da oynamaktadır")
    b = template.Context({"oyuncular":oyuncular})
    print s.render(b)
    27 yaşındaki Wesley Sneijder Galatasaray'da oynamaktadır
    
    Bu şekilde iç içe istediğimiz kadar liste veya sözlük tanımlayarak elemanlarına ulaşabiliriz. Son olarak Python'ın bize sağlamış olduğu bir modülü kullanacağımız bir örnek verelim.
    __author__ = 'mazlumagar'
    # -*- coding: utf-8 -*-
    
    from django import template
    from django.conf import settings
    import datetime
    
    settings.configure(DEBUG=True,Template_DEBUG=True)
    
    t = datetime.date(2013,12,12)
    
    s= template.Template("{{ tarih.year }} yılındayız.")
    b = template.Context({"tarih":t})
    print s.render(b)
    2013 yılındayız.
    
    Bu şekilde sizde örnekleri çoğaltarak Şablon yapısını daha iyi anlayabilirsiniz.
    Context Objesi:
    Context Objesi üzerinden istediğimiz gibi oynamalar yapabiliriz. Daha öncede söylediğimiz gibi sözlük gönderiyoruz. Bu yüzden sözlükler için geçerli olan kurallar burada da geçerlidir.
    # -*- coding: utf-8 -*-
    
    from django import template
    from django.conf import settings
    
    settings.configure(DEBUG=True,Template_DEBUG=True)
    
    c = template.Context({"isim":"Mazlum"})
    print c['isim']
    
    ##Var olan anahtarın değerini değiştirdik.
    c['isim'] = "Okan"
    print c['isim']
    
    ##yeni anahatar-değer ekledik.
    c['yas'] = 20
    print c['yas']
    
    ##Var olan anahatarı sildik.
    del c['yas']
    print c['yas']
    
    Kaynakça:

    20 Şubat 2014 Perşembe

    Bu yazıda Python'ın smtplib modülünü kullanarak mail atma işlemini yapacağız. smtplib modülünü kullanmak oldukça basit. İlk önce bir sunucu kullanmamız gerekiyor. Eğer siz isterseniz yerel makinenize bir sunucu kurarak onun üzerinden mail gönderebilirsiniz. Biz Google'ın smtp sunucusunu kullanacağız. İlk önce kullanacağımız fonksiyonların ne işe yaradıklarını açıklayalım.
    import smtplib #smtplib modülünün içe aktarımı
    
    smtplib.SMTP(sunucu,port) # Kullanılan sunucuya bağlanma işlemi
    
    smtplib.SMTP_SSL(sunucu,port) # Eğer sunucu SSL kullanıyorsa bu fonksiyon kullanılır. Bizde google için bunu kullanacağız.
    
    
    sunucu.sendmail(gonderici,alici,mail) # Mail gönderme işlemi
    
    sunucu.quit() # Sunucu ile bağlantının kapatılma işlemi
    
    
    Bir Python dosyası oluşturun ve aşağıdaki kodları kaydedin.
    # -*- coding:utf-8 -*-
    import smtplib
    
    
    #server = smtplib.SMTP("smtp.google.com",587)
    
    #Kullanıcıdan alıcağımız veriler için fonksiyon tanımladık
    def giris(kelime):
        return raw_input(kelime).strip()
    
    #Sunucu ile bağlantıyı kuran fonksiyonu tanımladık.
    def baglan():
        sunucu = smtplib.SMTP_SSL('smtp.gmail.com', 465)
        sunucu.login("gmail adresiniz","gmail şifreniz")
        return sunucu
    
    def mailgonder():
        sunucu = baglan()
    
        gonderici = giris("Maili gönderenin mail adresi:")
        alici = giris("Maili alanın mail adresi:")
    
        konu = giris("Mailin konusu:")
        icerik = giris("Mailin içeriği:")
    
        mail = """
                Gönderen:   %s
                Konu:       %s
                Mesaj:      %s
        """ % (gonderici,konu,icerik)
    
        try:
            #maili gönderiyoruz. Aldığı parametreler gonderenin mail adresi, alıcının mail adresi, ve mail içeriği
            sunucu.sendmail(gonderici,alici,mail)
            print "Mail başarılı bir şekilde gönderildi."
        except EOFError:
            print "Mail gönderilirken hata oluştu."
    
        sunucu.quit()
    
    #mail gönder fonksiyonunu çağırdık
    mailgonder()
    
    Mail kutusunu kontrol ettiğinizde mailin geldiğini görebilirsiniz.
    Kaynakça

    19 Şubat 2014 Çarşamba

    Şablon Nedir ve Nasıl Kullanılır ?

    Şablonlar sayfa tasarımını ve kod kısımlarını birbirinde ayırmamızı sağlarlar. Görünümler konusunda görümün fonksiyonları içerisinde doğrudan HTML taglarını kullanmıştık.
    def ana_sayfa(request):
        return HttpResponse("

    Ana Sayfa


    Ana sayfa içerikleri")
    Bu şekilde kullanım küçük projelerde ve tek başınıza bir proje geliştiriyorsanız sizin için sorun olmayabilir. Fakat büyük ve profesyonel projelerde tasarımı ve programlamayı aynı kişi yapmaz. Bu tarz projelerde bu tarz bir kullanımı düşünürsek tasarımcı ve programcının sürekli irtibat halinde olması gerekir. Programcı tasarımcının hazırladığı CSS ve HTML kodlarının programın içine entegre etmesi gerekir. Yada tasarımcı istediği görüntüyü elde edebilmek için program üzerinde çeşitli değişiklikler yapar. Bu şekilde bir proje geliştirmenin oldukça zahmetli olacağını kestirmek zor değildir. Django kullananlar için bu problemler Şablonlar ile ortadan kaldırılmıştır.
    Elimizde bulunan bir html dosyasını Şablonlar ile düzenleyelim.
    sablon.html
    
    
    
    {{ baslik }}
    
    
    
    Okul Adı: {{ okuladi }}
    Bölüm Adı: {{ bolumadi }}
    Sınıf : {{ sinif }}
    Programcı bu HTML kodlarını bilmek zorunda değildir. HTML kodlarını yazmak ve CSS ayarlarını yapmak tasarımcının işidir. Programcı buraya müdahale etmez. Sadece içerisine gönderilmesi gereken etiketleri bilmek zorundadır. Bu etikeler {{ etiket }} şeklinde tanımlanmıştır. Programcının yapması gereken tek şey bu etiketlere değerlerini göndermektir.
    sablon.py
    # -*- coding: utf-8 -*-
    
    veri = {
        'baslik':'Okul Bilgileri',
        'okuladi': 'Sakarya Üniversitesi',
        'bolumadi': 'Bilgisayar Mühendisliği',
        'sinif':2
    }
    
    HTML = open("sablon.html").read()
    for i in veri:
        HTML = HTML.replace("{{ "+i+" }}",str(veri[i]))
    
    print HTML
    
    Çıktı
    
    
    
    Okul Bilgileri
    
    
    
    Okul Adı: Sakarya Üniversitesi
    Bölüm Adı: Bilgisayar Mühendisliği
    Sınıf : 2
    Şablon mantığını anlamak için bu örneği verdik. Artık tasarımcı sablon.html dosyasını kendisine göre programcı sablon.py dosyasını kendisine göre düzenleyebilir. İki işi birbirinden ayırmış olduk. Bilmeleri gereken sadece etiketlerdir.
    Şablonları neden kullanmalıyız? sorusunun cevabını bir de http://www.djangobook.com/en/2.0/chapter04.htmlr adresinden alalım.
    • Sayfanın tasarımındaki herhangi bir değişiklik python kodlarında da bir değişikliği gerektirir. Bir sitenin tasarımı o sitenin temelinde olması gereken Python kodundan daha fazla değiştirmeye neden olur, yani sitenin tasarımını değiştirmek için Python kodunda değişikliğe ihtiyaç duyulmuyor ise bu mantıklı olanıdır.
    • Python kodu yazmak ve HTML tasarlamak iki farklı düzendir, ve çok profesyonel web geliştirme ortamları insanlar (hatta bölümler) arasında bu sorumlulukları böler. Tasarımcılar ve HTML/CSS codlayılar işlerinde başarılı olmaları için Python kodunda düzenleme yapılmasına ihtiyaç bırakmamalıdırlar.
    • Hem HTML hem de python kodunu içeren tek bir dosyanın düzenlenmesini bitirmek için diğerlerini bekleyen bir kişi yerine, programcılar Ptyhon kodları üzerinde ve tasarımcılar da şablonların üzerinde aynı zamanda çalıştırabiliyorsa bu iş en verimli olanıdır.

    Kaynakça
    • Mustafa Başer Django Kitabı

    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

    10 Şubat 2014 Pazartesi

    Django ile Proje Oluşturmak

    Django'yu kurduğumuza göre ilk projemizi oluşturabiliriz. Django ile proje oluşturmak oldukça basittir. Yapmamız gereken tek şey komut satırına şu komut parçasını yazmaktır.
    django-admin.py startproject ilkProjem
    
    Djano ile ilk projemizi oluşturmuş olduk. Burada dikkat etmemiz gereken komut satırında o anda hangi dizinde iseniz proje o dizin içerisinde oluşturulur. Eğer siz projeyi oluştururken nerede oluşacağını da belirtmek istiyorsanız şu şekilde kullanabilirsiniz.
    django-admin.py startproject ilkProjem /home/mazlumagar
    
    Bizim kullandığımız sistemin ana dizininde Django diye bir dizin var ve bu proje o dizin içerisinde oluşturuldu.
    Not: Burada kullanılan django-admin.py windows kullanıcıları için C:\Python27\Scripts(Python'un kurulu olduğu dizin sizde farklılık gösterebilir.) içerisinde bulunan django projeleri yaratmaya yarayan Python scriptidir. Windows kullanıcılarının bu şekilde doğrudan kullanabilmeleri için C:\Python27\Scripts yolunu WINDOWS PYTHON'I YOL'A EKLEMEK yazısında bahsedildiği gibi PATH'e eklemeleri gerekir. Linux kullanıcıları için gerekli bir işlem değildir. Merak edenler için söyleyelim Linux işletim sisteminde django-admin.py /usr/local/bin dizini içerisindedir.
    Projenin oluşturulduğu dizin içerisine giderseniz içeriğinin şu şekilde olduğunu göreceksiniz.
    ilkProjem/
             __init__.py
             setting.py
             urls.py
             wsgi.py
    manage.py
    
    ilkProjem: Bu dizinin adı proje adı ile aynıdır. Ama adını istediğimiz herhangi bir isim ile değiştirebiliriz. Proje klasörü de denir. İçerisinde projemize ait tüm dosya ve diğer klasörleri barındırır.
    __init__.py: Projenin bir Python projesi olarak algılanmasını sağlar. Boş bir dosyadır ve biz de içerisine herhangi bir şey yazmayacağız.
    settings.py: Django projemiz ile ilgili yapılandırmalar bulunur.
    urls.py: Projedeki adresler bulunur. Boş olarak gelir. Sitemizdeki adresleri buraya yazacağız.
    wsgi.py Bu dosya Django geliştirme sunucusu için WSGI(Web Server Gateway Interface,Web Sunucusu Geçit Arayüzü) uygulamasını içerir.
    manage.py: Django projemiz ile etkileşime geçmek için oluşturulmuş bir dosyadır. Bu dosyayı düzenlemeyiz. Daha fazla bilgiye buradan ulaşabilirsiniz.
    Artık oluşturduğumuz projeyi sunucu da başlatabiliriz. Projemizin bulunduğu dizindeki manage.py dosyasını çalıştırıyoruz.
    cd ilkProjem
    python manage.py runserver
    

    Çalıştırdıktan sonra projede herhangi bir problem yoksa , bu ilk projemiz ve bizim bir etkimiz olmadığı için hata olmaması gerekir. Yani şu şekilde bir çıktı alacağız.
    0 errors found
    December 09, 2013 - 23:03:45
    Django version 1.6, using settings 'ilkProjem.settings'
    Starting development server at http://127.0.0.1:8000/
    Quit the server with CONTROL-C.
    
    Projemizi surverda çalıştırdığımıza göre artık projemizi web tarayıcısı ile görebiliriz.
    http:://localhost:8000/
    
    İlkprojemizin görüntüsü şu şekilde olacaktır.
    Geliştirme sunucusu ön tanımlı olarak yerel ağ arayüzünden (127.0.0.1,localhost) 8000 portunu dinler. İstediğimiz bir arayüzün herhangi bir portu dinlemesini sağlayabiliriz.
    python manage.py runserver 127.0.0.1:7458
    
    Bu komut ile 127.0.0.1 ipsinin 7458 portunu dinlemesini sağladık. Tabi bunu yaptıktan sonra tarayıcıdan artık şu şekilde erişim sağlayacağız.
    http://127.0.0.1:7458/
    
    Kaynakça

    Django Kurulum

    Django kurulumu oldukça basittir. Sisteme Django kurabilmek için Python 2.x sürümünün sistemimizde kurulu olması gerekir. Django henüz Python'ın 3.x sürümü ile kararlı bir şekilde çalışmamaktadır.




    Not: Django kullanabilmek için Python programlama dilini bilmeniz gerekir. Eğer Python bilmiyorsanız Python Başlangıç serisine başlayabilirsiniz. Şimdi Django'yu sistemimize kuralım. Django'yu djangoproject.com adresinden son sürümünü veya doğrudan bir şekilde Buradan 1.6 sürümünü( yazı yazılırken en güncel sürümünü) indirebilirsiniz.
    Linux kullanıcıları için;
    tar xzvf Django-1.6.tar.gz
    cd Django-1.6
    sudo python setup.py install
    
    Bu komutları sırası ile komut satırında yazdığınız zaman Django sisteminize kurulmuş olacaktır. Adımları sırası ile açıklamak gerekirse;
    1-> Bu komut ile indirdiğimiz tar.gz uzantılı dosyayı bulunduğumuz dizine çıkartmış olduk. Bu komutun çalışabilmesi için indirdiğiniz dizinde olmanız gerektiğini unutmayın.
    2-> Çıkarttığımız dizinin içerisine girdik. 3-> Django'yu kurduk.
    Windows kullanıcıları için;

    Windows kullanıcıları için de durum pek farklı değildir. İndirdiğiniz tar.gz uzantılı dosyayı WinRar gibi bir program ile istediğiniz bir yere çıkartabilirsiniz. Biz C içerisinde olduğunuzu varsayalım.
    cd c:\Django-1.6
    
    Tıpkı Linuxda olduğu gibi çıkarttığımız dizinin içerisine girdik.
    c:\Python27\python.exe setup.py install
    
    Bu komutu yazdığımızda programımız kurulmuş olacaktır. Burada eğer neden c:\Python27\python.exe yazdığımız hakkında bir fikriniz yoksa .. yazısına göz atmanızı tavsiye ederim.
    Django'nun kurulumu bu kadar. Şimdi kuruldu mu kontrol edelim.
    python
    import django
    django.VERSION
    
    (1, 6, 0, 'final', 0)
    
    Eğer sizde bu şekilde bir çıktı aldıysanız Django sorunsuz bir şekilde kurulmuş demektir.