Yorumu yanıtla
Google App Engine İle Web Uygulamaları Geliştirme - 3
omerucel — Çar, 07/30/2008 - 13:26
Bu yazımızla webapp çatısı(framework) ile ilgili biraz bilgi vermeye çalışacağız. webapp çatısı App Engine ile WSGI arayüzünün uyumlu bir şekilde çalışmasını sağlar. WSGI(Web Server Gateway Interface) arayüzü web uygulamalarının, web ve uygulama sunucuları ile iletişimini sağlar. WSGI, Python için bir standarttır.
Google App Engine ile nasıl çalışacağımızı bir önceki yazımızda öğrendiğimize göre şimdi nasıl gerçek bir uygulama geliştireceğimiz konusunda bir şeyler öğrenmeye çalışalım. İlk olarak önceki yazıda oluşturduğumuz test.py dosyasını bir metin editörü ile açıp aşağıdaki şekilde tekrar düzenleyelim.
#-*- coding: utf-8 -*- from google.appengine.ext import webapp from google.appengine.ext.webapp.util import run_wsgi_app class Anasayfa(webapp.RequestHandler): def get(self): self.response.headers['Content-Type'] = 'text/html' self.response.out.write('Merhaba') if __name__=='__main__': uygulama = webapp.WSGIApplication( [('/',Anasayfa)], debug=True ) run_wsgi_app(uygulama)
Uygulamamızı çalıştırdığımızda bir önceki örnekte olduğu gibi ekrana Merhaba yazılacaktır. İkisi arasında işlev olarak fark olmasada yapı olarak fark var. İkinci uygulamamız webapp çatısı ile geliştirildi. Böylelikle istekler(Request), yanıtlar(Response), form uygulamaları, şablonlar(Templates) vb. için bu çatının bize sunduğu kolaylıklardan faydalanabileceğiz.
İsterseniz kodlarımızı satır satır açıklamaya çalışalım.
from google.appengine.ext import webapp from google.appengine.ext.webapp.util import run_wsgi_app
Burada çatımızı ve uygulamamızı çalıştırmak için kullandığımız run_wsgi_app fonksiyonunu uygulamamıza dahil ediyoruz.
class Anasayfa(webapp.RequestHandler): def get(self): self.response.headers['Content-Type'] = 'text/html' self.response.out.write('Merhaba')
Buradaki Anasayfa sınıfı uygulamamızın omurgasıdır diyebiliriz. webapp.RequestHandler ise miras(Inheritance) sınıfdır. Bu sayede Anasayfa sınıfı içerisinde webapp.RequestHandler sınıfının özelliklerini kullanabiliyoruz. Miras kavramıyla ilgili daha detaylı bilgi için aşağıdaki adresleri ziyaret edebilirsiniz.
http://docs.python.org/tut/node11.html#SECTION0011500000000000000000
http://www.java2s.com/Code/Python/Class/Classinheritanceinheritmembervar...
uygulama = webapp.WSGIApplication( [('/',Anasayfa)], debug=True )
Burada bağlantı tanımlamalarımızı ve hataların ayıklanma durumunu belirtiyoruz. debug=True ise, webapp ile etkileşim sonucunda bir sorun çıkmışsa, bu sorun tarayıcıda görüntülenmez. HTTP 500 hatası görüntülenir. Bağlantı haritası kısmını ise [('/',Anasayfa)] bölümü ile tanımlıyoruz. app.yaml dosyamızda url bölümü ile bu tanımlama yapılıyordu. webapp çatısını kullandığımız takdirde kodlarımız içerisinden de bu tanımlamayı gerçekleştirebiliyoruz.
run_wsgi_app(uygulama)
run_wsgi_app fonksiyonu ile son olarak uygulama değişkeni ile tanımladığımız uygulamayı çalıştırıyoruz.
İsterseniz şimdi bağlantı haritası konusunun kavranması amacıyla bu uygulamamızı geliştirelim. Senaryo gereği bir hakkımızda sayfası hazırlıyoruz ve bunu ayrı bir sınıf oluşturarak gerçekleştiriyoruz. Bu sayfa içinde bir bağlantı tanımlıyoruz.
#-*- coding: utf-8 -*- from google.appengine.ext import webapp from google.appengine.ext.webapp.util import run_wsgi_app class Anasayfa(webapp.RequestHandler): def get(self): self.response.headers['Content-Type'] = 'text/html;charset=utf-8' self.response.out.write('Anasayfa<br><br>') self.response.out.write('Hakkımda bilgi almak için <a href="/hakkimda">tıklayınız</a>.') class Hakkimda(webapp.RequestHandler): def get(self): self.response.headers['Content-Type'] = 'text/html;charset=utf-8' self.response.out.write('Hakkımda<br><br>') self.response.out.write('Buraya hakkımda sayfası ile ilgili bir miktar bilgi gelebilir.') if __name__=='__main__': uygulama = webapp.WSGIApplication( [ ('/',Anasayfa), ('/hakkimda',Hakkimda) ], debug=True ) run_wsgi_app(uygulama)
Hakkimda isminde bir sınıf oluşturduk. Bu sınıfı çalıştırabilmek içinde bağlantı haritası bölümüne ('/hakkimda',Hakkimda) verisini ekledik. Peki bağlantı haritası bölümünde sadece düz metinleri mi kullanabiliyoruz? Tabiki hayır. Düzenli ifadeler(Regular Expression) ile bu bölüme müdahale etme imkanına sahipsiniz. İsterseniz şimdi bununla alakalı bir uygulama geliştirelim.
Uygulamamızın bir haber sitesi olduğunu varsayarak farklı kategorilerdeki haberleri tek bir sınıf vasıtasıyla göstermeye çalışacağız.
#-*- coding: utf-8 -*- from google.appengine.ext import webapp from google.appengine.ext.webapp.util import run_wsgi_app class Anasayfa(webapp.RequestHandler): def get(self): self.response.headers['Content-Type'] = 'text/html;charset=utf-8' self.response.out.write('Anasayfa<br><br>') self.response.out.write('Ekonomi kategorisindeki haberler için <a href="/haber/ekonomi">tıklayınız</a>.') self.response.out.write('Gündem kategorisindeki haberler için <a href="/haber/gundem">tıklayınız</a>.') self.response.out.write('Spor kategorisindeki haberler için <a href="/haber/spor">tıklayınız</a>.') class Haber(webapp.RequestHandler): def get(self,kategori): self.response.headers['Content-Type'] = 'text/html;charset=utf-8' if kategori == 'ekonomi': baslik = 'Ekonomi Haberleri' haberler = ['Ekonomi haberi 1','Ekonomi haberi 2','Ekonomi haberi 3'] elif kategori == 'gundem': baslik = 'Gündem Haberleri' haberler = ['Gündem haberi 1','Gündem haberi 2','Gündem haberi 3'] elif kategori == 'spor': baslik = 'Spor Haberleri' haberler = ['Spor haberi 1','Spor haberi 2','Spor haberi 3'] self.response.out.write('%s<br><br>' %(baslik)) self.response.out.write('<ul>') for haber in haberler: self.response.out.write('<li>%s</li>' %(haber)) self.response.out.write('</ul>') if __name__=='__main__': uygulama = webapp.WSGIApplication( [ ('/',Anasayfa), (r'/haber/(.*)',Haber) ], debug=True ) run_wsgi_app(uygulama)
Haberlerin gösterilmesi için Haber sınıfını oluşturduk. Bağlantı haritası bölümüne (r'/haber/(.*)',Haber) verisini ekleyerek bağlantılar için tanımlama yaptık. Böylelikle /haber ile başlayan bağlantılarda bu Haber sınıfının çalışmasını sağladık.
Haber sınıfındaki get fonksiyonunun farklılığı dikkatinizi çekmiştir:
... def get(self,kategori): ...
kategori değişkeni, bağlantı haritası bölümünde tanımlanan (.*) verisinin içeriğini barındırmaktadır. Yani /haber/ekonomi, /haber/gundem vb. bağlantılar için ekonomi ve gundem değerlerini barındırmaktadır.
Sınıf içerisinde kullandığımız get fonksiyonu haricinde post, head, options, put, delete, trace gibi fonksiyonlarda bulunmaktadır. Bu fonksiyonlar öntanımlı fonksiyonlardır. Yeri geldiğinde bunlarla ilgili açıklamalar yapılacaktır. get fonksiyonu HTTP GET ile ilgili istekleri işlemek için kullanılır.
Bu yazımızda sizlere webapp çatısı ile uygulama geliştirme konusunda bilgi vermeye çalıştık. Bir sonraki yazıda daha farklı uygulamalarla Google App Engine ile uygulama geliştirme konusunda sizlere bilgi vermeye çalışacağız.

Son yorumlar
3 gün 4 saat önce
4 gün 2 saat önce
4 gün 2 saat önce
4 gün 10 saat önce
4 gün 16 saat önce
6 gün 15 saat önce
1 hafta 5 saat önce
1 hafta 2 gün önce
1 hafta 3 gün önce
3 hafta 14 saat önce