django etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
django etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

13 Nisan 2011 Çarşamba

GWT uygulaması ve Django arasında iletişim

Önceki yazıda GWT projesini Django ile sunmayı yazmıştım, bakmadıysanız önce ona bakmanız iyi olur.

GWT 2.2'nin yeni projelerde ürettiği örnek kod bir metin girişi ve bir "Send" düğmesi oluşturuyor ve Java sunucusuna bu metni gönderiyor. Aşağıdaki örnek bunu Django uygulamasına gönderip gelen cevabı da metin giriş kutusuna yazıyor. Kodun tamamını vermiyorum, nasıl çalıştığının anlaşılması yeterli olacaktır, GWT kodu SDK belgelerindekinin neredeyse aynısı zaten. Django kodu da açıklama gerektirmeyecek kadar kısa.

test.java

String url = "action";
final RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, URL.encode(url));
builder.setHeader("Content-Type", "text/plain");

try {
@SuppressWarnings("unused")
Request request = builder.sendRequest(textToServer, new RequestCallback() {

@Override
public void onResponseReceived(Request request, Response response) {
if (200 == response.getStatusCode()) {
nameField.setText( response.getText() );
} else {
nameField.setText( "Server error" );
}
}

@Override
public void onError(Request request, Throwable exception) {
nameField.setText("Connection error");

}
});
} catch (RequestException e) {
// TODO Auto-generated catch block
nameField.setText("Unknown error");
}



urls.py

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def action(request):
return HttpResponse("Your name is : %s" %request.raw_post_data )


urlpatterns = patterns('',
('^$', entry),
('^test/(.*)$', "django.views.static.serve", {"document_root":settings.STATIC_DOC_ROOT}),
('^action$', action),
)


Bu iletişim yöntemini JSON verilerini taşımak veya kendi XML-RPC yapınızı kurmak için kullanabilirsiniz.

11 Nisan 2011 Pazartesi

Django ile GWT projesini sunmak

Web projeleri için Django sunucu tarafında güçlü ve kullanımı rahat bir araç, aynı şekilde GWT'de istemci tarafında güçlü ve geliştiricisini rahat ettiren bir teknoloji. Bu ikisinin birlikte kullanımı kulağa hoş gelse de böyle bir kullanım GWT'nin sunucu imkanlarını, Django'nun da template sistemini (kısmen) kullanmaktan vazgeçmek demek.

Eclipse ile GWT projesini derleyince proje dizinindeki /war dizinine sunulacak dosyaları oluşturuyor. Bu dizin Django projesinin de kök dizini olarak kullanılabilir. Test isimli bir GWT projesi derlendiğinde ve Django ile yeni proje oluşturulduğunda şöyle bir dizin yapısı oluşuyor.

 /war
Test.html
Test.css
__init__.py
manage.py
settings.py
urls.py
test
|_...


Bu yapıda html ve css dosyası ile GWT'nin doğrudan erişime ihtiyacı olan test dizinini sabit içerik olarak sunmak gerekiyor. Bunu kullanacağınız sunucudan (Apache, nginx vs.) ayarlamak mümkün, bende kolay olduğu için önce öyle yapmıştım. Django projesi için ayrı bir dizin oluşturup sabit dosyaları doğrudan Apache'nin sunmasını sağladım. Ancak önemli bir sorun çıktı, Django kendi sunmadığı html sayfalarından gelen POST/GET çağrılarını kabul etmiyor. Sonuçta aşağıdaki değişiklikleri yaparak içeriği Django'nun sunmasını sağlamak gerekiyor.

 #Settings.py
ROOT_URLCONF = 'urls' #Çünkü projemiz kök dizinde
import os
TEMPLATE_DIRS = ( os.path.dirname(__file__).replace('\\','/'), )
STATIC_DOC_ROOT = os.path.dirname(__file__).replace('\\','/')+"/test"


Test.html Dosyasını Django'dan template olarak yüklemek için TEMPLATE_DIRS'ı dosyanın bulunduğu dizin olarak tespit ediyoruz, zaten bu sayfa bir defa yüklendikten sonra başka bir sayfa yüklenmeyecek. GWT Dosyalarının bulunduğu /test dizinini de sabit içerik dizini olarak tespit ediyoruz.


1:  #urls.py
2: from django.conf.urls.defaults import *
3: from django.template import loader, Context
4: from django.http import HttpResponse
5: from django.conf import settings
6:
7:
8: def entry(request):
9: t = loader.get_template('Test.html')
10: return HttpResponse(t.render(Context()))
11:
12:
13: urlpatterns = patterns('',
14: ('^$', entry),
15: ('^test/(.*)$', "django.views.static.serve", {"document_root":settings.STATIC_DOC_ROOT}),
16: )

Son olarak Test.css kök dizinde olduğu için onu /test içerisine taşımak, Test.html içerisinde de yolu değiştirmek gerekiyor.

<!-- Test.html -->  
<link type="text/css" rel="stylesheet" href="test/Test.css">

21 Mart 2009 Cumartesi

Django sunucusunda statik dosyalar ve Dojo



Biliyorsunuz django'nun "manage.py runserver" komutuyla çalıştırdığımız basit bir Http sunucusu var, bu sunucu ile test ettiğim küçük uygulamama bir CSS dosyası yüklemek istedim. Css dosyasını proje dizinine kaydettim her zamanki gibi yüklenmesini bekledim;


< style type="text/css">
@import "style.css";
</style>


Ancak django sunucusunun root dizini projenin olduğu dizin değilmiş. Yani Css icin HTTP 400 kodu aldım :) Bu CSS'yi ancak şöyle yükleyebildim;

Önce projenin settings.py dosyasına şunu ekledim;


STATIC_DOC_ROOT = '/home/user/django/projectname'


Sonra urls.py dosyasını açıp settings'i import edip, sunucudan /root adında sanal bir dizini servis etmesini ve bunu STATIC_DOC_ROOT değişkenindeki adrese bağlamasını istedim.


from django.conf import settings
.
.
.
urlpatterns = patterns('',
(r'^root/(?P.*)$', 'django.views.static.serve',
{'document_root': settings.STATIC_DOC_ROOT}),
.
.
.


Sonra da css dosyasını @import "/root/style.css" ile yükleyebildim.

Aslında derdim Css dosyası değil Dojo idi. Dojo javascript ile yazılmış bir Web araç takımı. Dojo'yu projenin dizinine açıp önce içindeki css temasına bir bakayım demiştim sadece. Css'yi yukarıdaki gibi halledince zaten Dojo'yu da aynı şekilde yükleyebildim.


<script type="text/javascript"
src="/root/js/dojo-release-1.2.3/dojo/dojo.js"
djConfig="parseOnLoad:true, isDebug:true"></script>


Dojo AFL ve BSD lisansı ile geliştirilen hafif ve hızlı bir araç takımı, henüz tam olarak inceleyemedim ama sitesindeki örneklere bakılırsa çok basit, şık ve kullanışlı görünüyor.

Ancak günün sürprizi şu oldu; "Nalet olsun içimdeki daldan dala atlayıp durma hevesine" diye söylenip bunlar için gogıllama yaparken bir de karşıma dojango diye bir şey çıkmasın mı! Allahım bu dünyanın çivisi çıkmış demek geldi içimden :)

13 Ocak 2009 Salı

"Django template" sistemini bağımsız kullanmak


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ül 2008 Perşembe

Django'da url ile dans

Ö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ül 2008 Salı

Django için paçaları sıvadım

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.