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">

Hiç yorum yok:

Yorum Gönder