18
Ara

Django da oluşturduğunuz bir uygulamada Modelinizi yazdınız ve syncdb parametresi ile veritabanı tablolarını oluşturdunuz. Daha sonra model sınıfınızda tablo yapısını etkileyecek düzenlemeler yaptınız ve tekrar syncdb ile tablonuzu oluşturmaya çalıştınız. Bir baktınız ki tablo da bir değişiklik yok, olduğu gibi duruyor. Bu Django’nun zayıf yanı oluyor ve güncel veritabanı tablonuzu oluşturmak için önceki tabloyu silmeniz gerekiyor. Ayrıca tablonuzun varolan sütunlarını etkilemeyen bir düzenleme varsa; bu değişiklik yeni sütun ekleme gibi bir şeyse ve tablonuz da ki mevcut veriler yerinde dursun diyorsanız Django’dan bunu şimdilik beklemeyin. Belki ileride bu özelliği eklerler…

Yukarıdaki gibi bir durum ile karşı karşıyaysanız South modülünü kullanmak durumundasınız. Öncelikle South modülünü kuralım: Bu modülü kurmanız için; ya buradan istediğiniz sürümü indirip kuracaksınız, ya setuptools modülü kuruluysa

easy_install South

komutuyla kuracaksınız, ya da easy_install ile pip modülünü kurup

pip install South

komutuyla modülü kurabilirsiniz.

South modülünü kurduysanız bir Django projesi oluşturup, uygulama oluşturalım…

django-admin.py startproject southdenemesi
cd southdenemesi
python manage.py startapp blog

southdenemesi adında bir proje oluşturduk. Sonra bu proje dizinine girip blog adında bir uygulama oluşturduk. blog dizinine girip models.py dosyasını metin düzenleyici ile açıp basit olarak şunu yazalım:

from django.db import models

class Post(models.Model):
	title = models.CharField(max_length=255)
	content = models.TextField()

Sonra proje dizinine dönüp settings.py dosyasını metin düzenleyicisi ile açalım.

INSTALLED_APPS = (
    # ...
    'south',
    'blog',
    # ...
)

Veritabanı ayarınızı yaptıktan sonra south ile birlikte blog uygulamamızı projemize ekliyoruz ve dizin içerisinde konsolu açıp tablolarımızı oluşturuyoruz.

python manage.py syncdb

Ardından

python manage.py convert_to_south blog

ile uygulamamızı south modülü için ilklendiriyoruz. Sonra models.py dosyamızı şu şekilde değiştiriyoruz.

from django.db import models

class Post(models.Model):
	title = models.CharField(max_length=255)
	content = models.TextField()
	pub_date = models.DateTimeField(auto_now_add=True)

Modelimizdeki değişikliği southa bildiriyoruz.

python manage.py schemamigration blog --auto

Bu komutu verince bize iki seçenek sunacaktır. “2″ yazıp devam ettiğimizde bize sütunun boş bırakılamayacağı için tarih bilgisi girmemizi istiyor(Eğer veri varsa her satır için aynı tarih verisi işleniyor sanırım). Bunu da

datetime.datetime.now()

kodunu yazarak hallediyoruz ve migration yani göç dosyamız, blog uygulamamızın içinde oluşturulan migrations dizininde 0002 ile başlayan bir Python dosyası olmuş oluyor. Oluşturulan göç dosyasını uygulamak için

python manage.py migrate blog

komutunu veriyoruz ve yeni tablo sütunu tablomuzdaki yerini alıyor. Eğer south uygulamasını projeye ekleyip syncdb ile tablosunu oluşturduktan sonra bir uygulama eklerseniz ilklendirmek için

python manage.py schemamigration uygulama --initial

işlemek için de

python manage.py migrate uygulama

komutunu veriyoruz. Daha sonraki düzenlemeleri yukarıdaki gibi –auto parametresi ile işleyebilirsiniz… Benim bilgim bu kadar. Daha fazla bilgi için buraya bakabilirsiniz. Hatam varsa bildiriniz.

Bu yazı Creative Commons-BY-SA ile lisanslanmıştır. Bu yazıyı ilk sahibini belirtmek ve aynı lisansla dağıtmak koşuluyla kullanabilirsiniz.

Benzer Yazılar:

  1. Django ile Çevirimiçi Ziyaretçi Sayacı Yapımı
7
Ara

İlk Django yazımda çevirimiçi ziyaretçilerin hesabını yapan bir uygulama yapımını anlatacağım. Bu dersten bir şey anlamak için Django hakkında biraz bilgi sahibi olmanız gerekecektir.

Türkçe kaynak için Google araması yaptığınızda karşınıza çıkacak kaynaklar büyük ihtimal şöyle olacaktır:

  • Django ile blog yapımı
  • Django belgelemelerindeki tutorialın aynısı, yani anket uygulaması

Ve başlangıç düzeyinde; internet üzerinde Türkçe olarak zaten yaygın olan başlangıç konuları… Benim anlatacağım konu da belki bu seviyede olacaktır, ama daha önce kafamın almadığı middleware konusunu azcık kavramış olmak ve bunu pratik olarak kullanmak olacak.

Öncelikle uygulamamızı deneyebilmek için bir proje oluşturmamız gerekiyor:

django-admin.py startproject sayacprojesi

Bu komutu konsolda veriyoruz ve projemizi oluşturuyoruz. Şimdi proje dizinine girip konsoldan şu komutu veriyoruz:

python manage.py startapp onlinecounter

Sayaç uygulamamızın temelini atmış olduk. Uygulamanın içine girelim ve çevirimiçi kullanıcıların veritabanında saklanması için gerekli olan model sınıfımızı models.py içine yazalım.

#-*- coding: utf-8 -*-
from django.db import models

class OnlineCounter(models.Model):
    ip = models.IPAddressField(verbose_name="IP Address", db_column="visitor_ip")
    is_user = models.BooleanField(verbose_name="User ?", db_column="is_user", default=False)
    visited_time = models.TimeField(verbose_name="Visited Time", db_column="visitor_time", auto_now_add=True)

    class Meta:
        db_table = "online_counter"
        verbose_name_plural = "Online Counter"

OnlineCounter adında bir Model sınıfı oluşturduk ve ip, is_user ve visited_time adında üç değişken tanımladık. Bunlardan ip değişkenine ip adresi kayıt edileceğinden “models” modülünün sağladığı IPAddressField sınıfını kullandık. Bu sınıf ip adresi için oluşturacağınız sütun için gerekli sql kodunu sağlar. Bu sütunun adının ise visitor_ip olarak gözükmesini sağlıyoruz.

is_user değişkenine ise BooleanField sınıfını kullandık. Siteyi ziyaret eden kişinin kayıtlı bir üye mi yoksa misafir mi olduğunu True ve False olarak veritabanında saklayacağız. BooleanField sınıfına db_column parametresiyle girdiğimiz “is_user” verisiylede sütun adını belirlemiş olduk. verbose_name parametresi Django yönetici panelinde verinin ne olduğu belirten bir ayrıntı olarak kullanılır.

Ziyaretçinin siteye girdiği anı belirlemek için de visited_time değişkenine TimeField sınıfını atadık. Sütun adını “visitor_time” olarak ayarladık ve veritabanına kayıt yapıldığında o anki zamanı sütuna yazması için auto_now_add parametresini True olarak belirledik.

Meta sınıfında ise OnlineCounter sınıfıyla ilgili düzenlemeler yapıyoruz. django.contrib.admin uygulamasını kullananların yönetici panelinde uygulamamızı “Online Counter” olarak görmeleri için verbose_name_plural değişkenini oluşturuyoruz ve tablo adını db_table değişkenine girdiğimiz değer ile online_counter yapıyoruz.

Şimdi uygulama dizinimizde middleware.py adında bir dosya oluşturuyoruz ve şunları yazıyoruz:

from onlinecounter.models import OnlineCounter
from datetime import datetime, time

class OnlineCounterMiddleware(object):
    def process_request(self, request):
        now_time = datetime.now().time()
        limit = time(now_time.hour, now_time.minute-5, now_time.second, now_time.microsecond)
        OnlineCounter.objects.filter(visited_time__lt=limit).delete()
        online, create = OnlineCounter.objects.get_or_create(ip=request.META["REMOTE_ADDR"])
        if request.user.is_authenticated():
            online.is_user = True
        else:
            online.is_user = False
        if not create:
            online.visited_time = now_time
        online.save()
        request.online = self

    def total(self):
        total = OnlineCounter.objects.all().count()
        return total

    def guest(self):
        guest = OnlineCounter.objects.filter(is_user=False).count()
        return guest

    def users(self):
        users = OnlineCounter.objects.filter(is_user=True).count()
        return users

models.py modülümüzü ve datetime modülünün datetime ve time fonksiyonlarını içe aktardık ve OnlineCounterMiddleware adında bir sınıf oluşturduk.

Django, her istek(request) yaptığında projeye ekli middleware sınıflarının process_request() methodunu çağırır. Bu da siteye giren herkesin sayacımız tarafından yakalanmasını sağlar. Php de olduğu gibi gerekli her php dosyasına kod eklemek zorunda kalmayız.

process_request() methodumuz çağırılacağına göre kodumuzu da bu method altına yazıyoruz.

Methoda request adında bir parametre atıyoruz. Bir kullanıcı istek yaptığında gerekli verileri Django, methodun bu parametresine atamaya çalışır.

now_time değişkenine istek yapıldığı anda ki zamanı öğrenmek için gerekli kodu yazıyoruz. limit değişkenine ise bir ziyaretçinin kaç dakika işlem yapmadığında veritabanından atılacağını belirten zamanı ayarlıyoruz. Hemen altındaki satırda limit değişkenindeki zamanın veritabanındaki zamandan küçük olan ziyaretçileri veritabanından siliyoruz. filter() methoduna girdiğimiz visited_time değişkenine eklediğimiz __lt ise “< " operatörünün sihirli method adı verilen methodlardaki adını temsil ediyor. Bu sayede zaman karşılaştırılmasını yapıyoruz.

Bir sonraki satırda ise get_or_create() methodu ile eğer request.META["REMOTE_ADDR"] ile belirtilen ziyaretçi sitede ise verisini çek, yoksa veri oluştur diyoruz. Geriye dönüş olarak bir tuple döndürür. Tuple verisinin ilk elemanı OnlineCounter nesnemiz, ikincisi ise veri çekildiyse False veri oluşturduysa True olur. Bu verileri de online ve create değişkenine pay ettik.

request.user.is_authenticated() kodu bize kullanıcı girişi yapıldıysa if blokunu isletmemizi sağlar ve is_user niteliğini True olarak ayarlarız. Giriş yapılmadıysa else bloku çalışır ve is_user niteliğini False olarak ayarlarız. Sonraki if blokunda ise eğer veri oluşturulmayıp çağırıldıysa, ziyaretçinin ziyaret zamanını güncelleriz.

online.save() ile değişiklikleri kaydediyoruz ve request e online adında bir nitelik oluşturup "self" ile sınıfımızı atıyoruz.

Oluşturduğumuz total() methodunda bütün veriyi çağırıp nesnemizin count() methoduyla kaç çevirimiçi kişi olduğunun verisi alıyoruz. guest() ve users() methodlarında ise OnlineCounter sınıfının is_user niteliğini kullanarak misafir mi, üye mi diye filtreleme yapıyoruz ve sonucu döndürüyoruz. Middleware sınıfımızla işimiz bu kadar.

Şimdi proje dizinine dönüp views.py adında bir dosya oluşturun ve şu şekilde yazın:


from django.shortcuts import HttpResponse

def main(request):
    online = """<p>Toplam: %s
    <p>Misafir: %s</p>
    <p>Kullanıcı: %s</p>"""%(request.online.total(), request.online.guest(), request.online.users())
    return HttpResponse(online)

urls.py dosyasını ise şöyle düzenleyin:

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

urlpatterns = patterns('',
    url(r'^onlinecounter/$', 'views.main'),

)

settings.py dosyasına ise aşağıdaki şekilde düzenleyin:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'visitors.db', # veritabanı ayarları.

MIDDLEWARE_CLASSES = (
    'onlinecounter.middleware.OnlineCounterMiddleware', # middleware sınıfını ekleyin.
)

INSTALLED_APPS = (

    'onlinecounter', # uygulamamızı ekliyoruz.
)

Uygulamamız hazır olduğuna göre veritabanı tablomuzu eklemek için

python manage.py syncdb

komutunu veriyoruz ve ardından

python manage.py runserver

komutunu verip sunucuyu başlatıyoruz. İnternet tarayıcınızın adres çubuğuna localhost:8000/onlinecounter/ yazarak sonucu görebilirsiniz. admin uygulaması ekliyse ve giriş yaptıysanız kullanıcı sayacında, aksi halde misafir sayacında gözükeceksiniz. middleware sınıfımız sayesinde de istediğiniz bir template dosyanıza

{{ request.online.total }}
{{ request.online.guest }}
{{ request.online.users }}

şeklinde yazarak sonucu görebilirsiniz. Anlattığım gibi bir modül yazdım ve github hesabımda proje oluşturdum ve 1.0 sürümü ile kullanıma hazır.

easy_install django-online-counter
ya da
pip install django-online-counter

komutlarıyla kurabileceğiniz gibi

git clone https://mthnzbk@github.com/mthnzbk/django-online-counter.git

komutuyla dosyaları indirip

python setup.py install

ile kurabilirsiniz. Tabii ki bunları yapabilmeniz için; easy_install için python-setuptools paketini, git için git paketini, pip için ise

easy_install pip

komutuyla pip uygulamasını kurmanız gerekmektedir...

Bu yazı Creative Commons-BY-SA ile lisanslanmıştır. Bu yazıyı ilk sahibini belirtmek ve aynı lisansla dağıtmak koşuluyla kullanabilirsiniz.

Benzer yazı yok.

20
Ara
Nedense yazılım işinden belli bir uzaklaşma yaşıyorum. "Belki de uzaklaşmam, biraz kendimi nadasa bırakmam gerek" diye düşünüp kendime biraz mola hakkı tanıdım. Gerçekte var olan, ekran dışında yaşayabilen bir şeyler yapmaya çalışıyorum ancak, tabi alışmış kudurmuştan beterdir basit bir iki şey kodlayarak elimi oyaladığım da oluyor.

SitePiyango da bu tip bir akşam eğlencesi olarak ortaya çıktı. Kendisi adından da anlaşılacağı üzere bir piyango sistemi. Hediye olarak ise kendisine gelen bütün trafiği gün boyunca sizin sitenize armağan etmeyi vaad ediyor. Ayrıca eğer siteniz kazandıktan sonra editörün (yani benim :) hoşuna giderse hakkında bir tanıtım yazısı yazısı da hazırlanıp Facebook daki Her Gün Bir Yeni Site sayfasında yayınlanıyor.

Ayrıca katılımcılar arasındaki, katılım kuponu kazanma savaşını izleme eğlenceli olabiliyor. :) Hem slogan bile buldum :

SitePiyango, sitenize trafik getirmenin bedava ve biraz da kumarbaz yolu.
10
Eyl

WordPress’te “Tanrı Yanılgısı” diye bir başlık attığınızda, WordPress’in sizin için ürettiği URL’e bakalım:

http://blog.gokmengorgen.net/2010/09/09/tanri-yanilgisi/

Tam istediğimiz gibi. Django ile bir blog uygulaması yazıyor olsaydım, sanırım biraz sıkıntı çekecektim:


In [1]: from django.template.defaultfilters import slugify

In [2]: slugify('Tanrı Yanılgısı')
Out[2]: u'tanr-yanlgs'

Gitti ı’lar… Türkçe karakterler arasından Django’nun slugify’sinde çalışmayan tek karakter küçük harfle yazılmış ‘ı’. Baştan slugify fonksiyonuna bir yama yapıp Django ekibine göndermeyi düşündüm; fakat sadece Türkçe’yi dikkate aldığım için büyük ihtimalle yamam reddedilecekti. Ben de bir utils.py dosyası açıp şöyle bir slugify fonksiyonu yazdım:


def slugify_unicode(value):
    value = value.replace(u'\u0131', 'i')
    value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')
    value = unicode(re.sub('[^\w\s-]', '', value).strip().lower())

    return mark_safe(re.sub('[-\s]+', '-', value))

Bu fonksiyonu iPython’da denediğinizde patlıyor; ama sitede kullandığınızda herhangi bir sorunla karşılaşılmıyor. Bunun sebebi, ‘ı’ harfinin iPython konsolunda \u0131 olarak dönmemesinden kaynaklanıyor:


In [5]: u"Tanrı Yanılgısı"
Out[5]: u'Tanr\xc4\xb1 Yan\xc4\xb1lg\xc4\xb1s\xc4\xb1'

Bu bana Python’un garipliği gibi geliyor ve Python3′te sorunun düzeltildiğini söylüyorlar (Python3′te unicode default olacak). Henüz denemedim. Emin olmamakla birlikte, slugify fonksiyonu için değer olarak verdiğim başlığın Django’dan “Tanrı Yanılgısı” olarak değil de, “Tanr\u0131 Yan\u0131lg\u0131s\u0131″ çekilmesinden kaynaklanıyor:


In [24]: x = u"Tanr\u0131 Yan\u0131lg\u0131s\u0131"

In [25]: x
Out[25]: u'Tanr\u0131 Yan\u0131lg\u0131s\u0131'

In [26]: slugify_unicode(x)
Out[26]: u'tanri-yanilgisi'
15
Ağu

Pardus’un 2010 yılı staj programının 2. dönemi 2 Ağustos’ta başladı. Pardus Gezegeni staj dönemlerinde pek bir sessiz oluyor ama svn deposundaki hareketlerden UEKAE’deki ofiste stajını sürdüren arkadaşların çalıştığını görebiliyoruz. 2. dönem stajını ArtistanbulPR’da yapacak talihliler de Orçun ve benim.

Görevimiz Özgürlükİçin’in Tema bölümünü yenilemek ve büyük pay da Orçun’a ait. Kendisi 2 haftadır üzerinde çalışıyor ve oldukça güzel bir iş çıkarıyor. Onun işi tamamlamasıyla beraber Tema bölümüne RESTful bir API ekleyeceğiz. Aslında bu API’i Özgürlükİçin 3.0′ın yapılacak listesine eklemiştim fakat yeni Tema uygulamamızın Pardus’un masaüstü hizmetleri ile iletişimini sağlayan KNewStuff (eski adıyla GHNS) özelliği için yazmamız gerekiyor.

Orçun benden daha sık blog yazdığı için kendisini şuradan takip edebilirsiniz. Blog yazma konusunda darısı stajını UEKAE’deki ofiste yapan arkadaşların başına diyerek danışmanlarına ve kendilerine taş atarak bitireyim..

2
Ağu

Bugünlerde bir projemize API yazmak için kolları sıvadık. Öncelikle kaynak kodları paylaşılan Django projelerinin RESTful API’lerini nasıl oluşturduklarını incelemeye koyulduk. Bir kısmı wapi benzeri modüllerle kendilerine özel çözümler üretirken bazıları da küçük django paketleri ile sorunu kısa yoldan çözmüşler.

Biz de hızlıca API’i ortaya çıkarabilmek için ikinci seçeneği uygun gördük ve django-piston kullanmaya karar verdik. Social coding iyi şey güzel şey fakat işin içine birbirinden farklı sürüm kontrol sistemleri girince işler çok karışabiliyor. Projemizi Subversion ile geliştirirken, follow ve invite uygulamalarını Git ile geliştiriyoruz. Şimdi bir de django-piston’ın mercurial’ı çıktı derken kendisini GitHub’a taşıyalım dedik.

Biraz araştırma ile prosedürün şöyle işlediğini öğrendik ve sizlerle paylaşmak istedim.

  1. git clone git://repo.or.cz/fast-export.git
  2. mkdir yeni_git_deposu
  3. cd yeni_git_deposu
  4. git init
  5. fast-export_dizini/hg-fast-export.sh -r mercurial_dizini
  6. git repack -a -d -f
  7. git remote add origin git@github.com:kullaniciadi/depoadi.git
  8. git push origin master

8 adımı da tamamladıktan sonra kendinize güzel bir espresso alıp kodlamaya devam edebilirsiniz ;)

git remote add origin git@github.com:ahmet/test.git
28
Haz
Artistanbul'da ilk hafta son derece eğlenceli bir şekilde sonisphere ile noktalandı. Biraz tecrübe kazanmak birazda buradaki ekibin işleyişini öğrenmek için bu haftayı bir blogger uygulaması geliştirmekle geçirdik. Burada kodlama mümkün olduğunca standart kütüphanelerden faydalanarak yapılıyor. Zaten yazılmış olanın tekrar yazmak yok. Buna karşılık kod konusunda pek seçici değiller, değişken isimleri, yorum satırları vs. öyle inanılmaz önemli değil, bunun sebebinin python da zaten okuyup anlamanın çok kolay olmasına bağlıyorum, yada Gökmen ve Uğur çok zeki koda bakınca hiçbir şey sormadan sorunlarımızı çözüyorlardı :D
Belki basit olabilir ama, Bir blogger yazarak neler öğrendim bir bakalım:
1. POST bilgilerini tek tek almaya çalışma, forms.py diye birşey var Django'da
2. Etiketleri de tags kütüphanelerine bakarak kolayca halledersin, elle yazma.
3. URL Name Dispatcher kullan, url değişikliklerine karşı programını koru.

gördüğünüz gibi bunların hepsi dokümanları inceleyerek öğrenilebilir, ama kim evde kod yazarken doküman okumak ister ki? Ayrıca öğrendiğim en önemli şey, Django hata ayıklama raporlarına inanmamaktı. Aldığım hataların yarısı bile yanlış olan yeri göstermiyordu, dünyanın en güvenilmez hata ayıklayıcısını yazmışlar bariz biçimde.


Ortamdan bahsedecek olursak, tek kelimeyle rahat. Geliş saati 10:30~ sabah trafiği vs. sorunu olmuyor (tabi bunu kartaldan gelen Ufuk'a sormak lazım asıl), çıkış buna göre 19:00 civarı seyrediyor, ama pek kesin değil. öğlen molası vs. yok, ama istersen kulaklıkları takıp film izlemek, oyun oynamak, kapının önüne inip çekirdek çitletmek serbest. Bu kulağa ne kadar süper gelse de bir haftada Ali abinin dehasını gördüm. 10 kişilik ofiste, öyle çekirdek serbest falan güzel olsa da, insan vicdan yapıyor bir nevi, öyle 2 saat mola veremiyor, 5 dk. sözlük okuyup direk işe devam ediyorum ben şahsen. Buzdolabımız var burada, çılgınca ice-tea tüketiliyor, öğlen yemeklerimiz anlaşmalı bir lokantadan geliyor. Asıl eğlence Ahmet'te, şu anda bile anlattıkça coşuyor, coştukça anlatıyor, bu adam ne zaman çalışıyor?


her neyse toparlamak gerekirse, çok çalıştık çok eğlendik. Sonisphere ile haftayı üzerimizden attık, Bu hafta artık papercut yazılacak, bu gün bir toplantı yapıp feature set çıkaracağız, hafta sonuna kadar temel işlevleri çalışan bir sistemimiz olacağı kanaatindeyim. tabi ki bir özgür yazılım portalının projesi olarak herkesin görebileceği şekilde geliştirilecektir, bizler başladığımızda, isteyenlerin kodu inceleyebilmeleri için svn adresini yine buradan paylaşacağım.
27
May

Bu 3′lüyü yan yana getirmek benim için zordu. Fakat en sonunda bunu başardım. Diğer sitelerdeki gibi sadece konfigürasyonu yazıp, bırakmayacağım. Hepsini tek tek adımlar şeklinde yazdım. Süreç kısacası Django projesi oluşturup bunu Apache ile ilişkilendirmeniz.

1. Edinmek:

Django, Apache ve mod_python üçlüsünü indirmemiz gerek. (Bu adımlar sadece Pardus içindir. Diğer dağıtımlar hakkında bir şey diyemeceğim.)

sudo pisi it Django apache mod_python

2. Django işine başlamak ve bitirmek:

Dikkat: Projeyi oluşturmadan önce lütfen django projenizi koyacağınız bir klasör oluşturun ki Apache’de sıkıntı yaşamayın.

Bir Django projesi oluşturmamız gerek.

django-manage.py startproject newsite

“/home/tdgunes/django/mysite”‘da duruyor diyelim.

Ve Django Test Sunucusu’nun çalışıp çalışmadığını kontrol edebilirsiniz..

python manage.py runserver

3.  Apache’yi Ayarlamak:

Konsola tek tek yazın:

cd /etc/apache2/modules.d/

sudo nano 16_mod_python.conf

Sonra alttakileri dosyanın en sonuna yazın.

<Location “/”>

SetHandler python-program

PythonHandler django.core.handlers.modpython

PythonPath “['/home/yourname/django/] + sys.path ”

SetEnv DJANGO_SETTINGS_MODULE newsite.settings

PythonDebug On

</Location>

4. Apache’yi çalıştırmak:

Yazın:

sudo service apache start

Her açılışta çalışmasını istiyorsanız:

sudo service apache on

ya da servis yöneticisinin plasmoidini kullanabilirsiniz.

Hepsi bu kadar. Tüm bu parçaları yerine koymak zordu fakat şu an bu yöntem ile sunucunuz sorunsuz bir şekilde çalışmalı.

9
Oca
Sonunda taşınma işi bitti! Evet arkadaşlar sorunları halledip sistemimi tamamen sunucuya taşıdım. İlk django sitem nysera.net artık açık ama test yayınında diye not düşüyorum! Duyurusunu şimdiye kadar yapmamıştım çünkü tüm problemleri halledememiştim lanet bir satırın sonuna "/" işaretini koymayı unuttuğum için 10 sayfa hata kaydını okumak zorunda kaldım. Baştan daha dikkatli okusaydım bu sorunu yaşamayacaktım hatalara bakıyordum "mediaccs" diye bir şey var dikkatimi çektide anca fark ettim.

Django'yu Ubuntu kurulu bir sunucu üzerinde Emre Yılmaz'ın tavsiyesi ile apache ve mod_wsgi ile çalıştırıyorum. Aslında çoğu sitede mod_python örneği gösterildiği için onu kullanacaktım ama Emre'nin uyarısıyla mod_wsgi'a geçtim. Kendi hatalarımda dışında gayet memnunum.

Neyse mod_wsgi kullanmak için bu dökümanı tavsiye ederim.

Temel olarak kaynak kodlarınız arasına django.wsgi isimli bir dosya ekliyorsunuz sonra apache de confing dosyanıza bir iki ekle site hazır hale geliyor. Fazla uğraştıracak bir kısmı yok ama ben admin medya dosyalarının adresini düzgün yazmamışım. Öncelike ilk hata dökümanın tekinden direkt kopyalamam olmuştu. Bu Linux'a ne kadar alışık olduğunuzla alakalı bir şey hiç aklıma gelmemişti kütüphanenin orada olmayabileceği, sonra kendim arayıp doğru dizini buldum. Belki de bilerek yanlış yazmışlardı doğrusunu öğrenmemiz için... /usr/lib/ altına bakmanızı tavsiye ederim. Sonra bu konumu yazarken satırın sonuna "/" eklemeyi unutmayın derim. Apache'yi yeniden başlatırken bir uyarı vermiyor ama sitenizin kayıtlarına baktığınızda uzun bir listeyle karşılaşıyorsunuz^^

Bir başka hata debug seçeneğini kapattıktan sonra 404.html ve 500.html gibi hatalar için gerekli dosyaları oluşturmamaktı. Debug seçeneği açıkken Django'nun kendi hata sayfalarıyla karşılaşıyorsunuz ama debug'ı kapattığınızda bu dosyaların template klasörünüzde bulunması gerekiyormuş.

Bir diğer hata Türkçe karakter problemiydi. Şimdiye kadar hep sqlite üzerinde çalıştığım için mysql'de ayarların nasıl yapılacağı konusunda pek bilgim yoktu. Türkçe karakter problemini gidermek için yeni bir veritabanı oluşturmam gerekti ama bu sefer veritabanını oluştururken CREATE DATABASE mydb DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; şeklinde karakter set ve collation ayarlarını ekledim. Bu Türkçe karakter problemini ortadan kaldırdı. Zaten kodları utf8 ile kaydediyorum tema dosyalarında da kodlama bilgisi utf8 olarak geçtiği için başka bir ayar yapmama gerek kalmadı. Bu tüyoyuda Ozan Hazer'in blogundan öğrendim, kendisine buradan teşekkür ederim.

Başka bir hata da setuptools'u kurmayışımdı. Django eggs dosyalarını kullanıyormuş. Ben bunu bilmiyordum dökümanın tekinde de kurulması gerektiği yazmıyordu ama eğer kendi sunucunuzu yönetiyorsanız python-setuptools'u da mutlaka yükleyin. Egg nedir merak ediyorsanız IBM'in geliştirici sitesinde çok güzel bir makale mevcut, işinize yarayacaktır.

Umarım bu yazı işinize yarar. Herkese kolay gelsin
13
Oca

Django'nun en sevdiğim tarafı veritabanı soyutlaması değil şablon sistemi, bunu da bağımsız bir python projesinde kullanabilir miyim diye bakınırken önce yolum (Pardus IRC kanalından uic'in önerisiyle) Mako Templates'e düştü. Bir taraftan Mako'yu kurcalarken bir taraftan da django belgelerine bakınıyordum ve bingo! küçük bir paragraf buldum, tam istediğim şey...



# -*- coding: utf-8 -*-
from django.template import Context, Template
    
#İşte burada manuel konfigürasyon yapıyoruz
from django.conf import settings
settings.configure()
    
    
def index():
     t = Template('Benim şablonum {{ var }}.')
     c = Context({'var': 'süper oldu.'})
     return t.render(c)
    
print index()


Ayrıca configure() fonksiyonuna parametre olarak çeşitli ayarları belirtmek mümkün;


settings.configure(DEBUG=True, TEMPLATE_DEBUG=True,
     TEMPLATE_DIRS=('/home/web-apps/myapp', '/home/web-apps/base'))
25
Eyl
Önceki yazıda Django ile veritabanı kullanımı örneği yapacağımı yazmıştım ama url adresleri ile oynarken çok eğlenceli şeyler çıktı ortaya yazmadan edemedim.

Önceki örnekteki urlpatterns listemiz aşağıdaki gibiydi;

from deneme.dersler import dersindex, ders1, ders2

urlpatterns = patterns('',
('^$', dersindex),
('bolum1', ders1),
('bolum2', ders2),
)

Buradaki ilk değerin boş olduğunu görüyorsunuz, bu değeri ihtiyaç halinde ön-ek (prefix) olarak kullanabilirsiniz. Şöyle;

from deneme.dersler import *

urlpatterns = patterns('deneme.dersler',
('^$', dersindex),
('bolum1', ders1),
('bolum2', ders2),
)

Peki şöyle bir import yazdıysak?

from deneme.dersler import *
from deneme.makale import *

#Şöyle

urlpatterns = patterns('deneme.dersler',
(r'^$', dersindex),
)

urlpatterns += patterns('deneme.makale',
(r'^$', makaleindex),
)

Bu r'^$' ifadesinde önceki örnekten farklı olarak bir "r" ekledim, bu zorunlu olmasada Python'a bu ifadenin string değil raw olduğunu anlatıyor ve kullanılması iyi olur.

Ayrıca Python'un 255 karakterlik bir fonksiyon arguman limiti var, yani büyük bir sitenin patterns() listesi büyük boyutlara ulaştığında yukarıdaki yöntem kullanılabilir.

Şimdi "/pardus/2008/1" adresini yazacağım pardussurumleri() fonksiyonu ile oluşturmak istiyorum. Bunun için yeni bir pardus.py dosyası açıp şu şekilde yazdım;


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

from django.http import HttpResponse

def pardussurumleri(request, version, subversion):
html = "Pardus "+version+"."+subversion
return HttpResponse(html)

Düzenli ifadede olarak kısaca "pardus/", 4 haneli sayı, "/" ve bir haneli sayı tanımı yapıyoruz.

urlpatterns += patterns('deneme.pardus',
(r'^pardus/(\d{4})/(\d{1})/$', pardussurumleri),
)

Peki fonksiyon tanımını şu şekilde yaptığımızı farz edelim;

def pardussurumleri(request, subversion, version):

Bu durumda "/pardus/2008/1" url adresi sonucunda Pardus 1.2008 gibi bir çıktı alırız, ancak aşağıdaki gibi bir pattern tanımı yaparsak fonksiyonumuz pardussurumleri(request, version="2008", subversion="1") olarak çağırılacak.

urlpatterns += patterns('deneme.pardus',
(r'^pardus/(?P<version>\d{4})/(?P<subversion>\d{1})/$', pardussurumleri),
)

Bunun ışığında /pardus20081 url adresi için şöyle bir ifade kullanılabilir.

r'^pardus(?P<version>\d{4})(?P<subversion>\d{1})/$'

Eğer henüz test aşamasındaki bir sürüm için kullanılacak bir url için "/pardus2009test" yerine "/pardus2009" kullanmak istersek pattern ile fonksiyona sabit bir değer geçirebiliriz.

(r'^pardus(?P<version>\d{4})/$', pardussurumleri, {'subversion' : 'test'})
23
Eyl
Bende sonunda eğlenceyi doruklarda yaşamak için Django ile "Selam cümlet-ül alemin" (Hello world) dedim. Linus'un Linux 1.0 duyurusunu yaptığı sıralarda (tabii 2 yıl öncesine kadar bundan haberim yoktu) ben bir Apple makinasındaki GWBasic ile "hello world" yazmanın heyecanını yaşayan bir gençtim. O gün bu gündür ne zaman yeni bir "hello world" yapsam hep aynı heyecanı duyuyorum. Bu arada "hello world yapmak" diye bir deyimi ilk kullanan kişiyim herhalde.

Her neyse, bu yazı öyle geyik bir yazı olmasın bir işe yarasın, diye neler yaptığımı anlatayım.

Django 1.0'ı Pardus'da kurmak için "sudo pisi it Django" komutu veya Paket Yöneticisinden tıklamanız yeterli.

Daha sonra projeler için bir klasör açmanız iyi olur, ben ev dizininde django adında bir klasör açtım, konqueror ile bu dizine girip F4 tuşuna basarak konsolu açın ve ilk projenizi aşağıdaki komut ile oluşturun.

django-admin.py startproject deneme

Django bu komutla deneme adında bir dizin oluşturacak ve proje için gerekli temel dosyaları buraya yazacaktır. Proje henüz boş ancak çalışıp çalışmadığını aşağıdaki komutla hemen test edebilirsiniz.

python manage.py runserver

Bu komutu deneme dizininde vermelisiniz, çünkü manage.py orada. Komut çıktısından anlayacağınız gibi tarayıcınızın http://127.0.0.1:8000 adresinden projenizi görüntüleyebilirsiniz. Kocaman bir "It worked" yazısı görmüş olmalısınız. Evet şimdi kendi kodlarımızı yazalım;

deneme Dizini altında "dersler.py" adında bir dosya oluşturun, içeriği şöyle;


# -*- coding: utf-8 -*-
#Üst satır Türkçe karakterler için

#Django kütüphanesinden bir işlev ekliyoruz
from django.http import HttpResponse


#Bu fonksiyon sitemizin indeks sayfasını oluşturacak
def dersindex(request):
html = "<a href='bolum1'>Bölüm 1</a><br>"
html += "<a href='bolum2'>Bölüm 2</a><br>"
return HttpResponse(html)


#Bu fonksiyon da başka bir sayfa
def ders1(request):
msg = "Django mu? o da ne?"
return HttpResponse(msg)



#Bir başkası
def ders2(request):
msg = "Django Reinhardt ünlü bir gitaristtir."
return HttpResponse(msg)


Bu üç fonksiyonun ortak özelliklerine dikkat edin, parametre olarak "request" alıyorlar ve HttpResponse ile değer döndürüyorlar. Buradaki her bir forksiyonun yaptığı sadece sayfanın içeriğni oluşturmak. dersindex Fonksiyonunudaki HTML kodlarına bakarsanız /bolum1 ve /bolum2 dizinlerine bağlantı verildiğini görüyorsunuz, ancak projemizde böyle bir dizin açmadık, şimdi anladığınız üzere ders1 ve ders2 diye iki fonksiyonumuz var ve bu url adreslerini bu fonksiyonlara bağlamamız gerekiyor. Bunu da Django'nun oluşturduğu urls.py dosyasından yapıyoruz. Bu dosyayı şöyle düzenledim;


# -*- coding: utf-8 -*-
#Bunu ben ekledim

from django.conf.urls.defaults import *

#Bunu da ben ekledim, yazdığımız fonksiyonları projeye ekliyoruz
from deneme.dersler import dersindex, ders1, ders2

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()


urlpatterns = patterns( '',
('^$', dersindex),
('bolum1', ders1),
('bolum2', ders2),
)


Böylece patterns fonksiyonundaki parametreler ile sitemizin /bolum1 adresi çağırıldığında ders1 forksiyonunun çalışmasını sağlamış oluyoruz. Bu url adreslerinde '^$' gibi düzenli ifadeler kullanılabiliyor, bunula ilgili http://pythontr.blogspot.com/2008/09/dzenli-ifadelelerde-kullanlan.html adresinden bilgi alabilirsiniz.

Merak etmeyin Django ile veritabanı kullanmak en az bu örnek kadar basit :) Bir sonraki örnekte ona bakarız.