Python TR

  • anasayfa
  • forumlar
  • gezegen
  • Üye ol
Ana sayfa

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.

  • Makale

Yeni yorum gönder

  • Web sayfası ve e-posta adresleri otomatik olarak bağlantıya çevrilir.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img> <object> <param> <embed> <s> <blockcode>
  • Satır ve paragraflar otomatik olarak bölünürler.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>. Beside the tag style "<foo>" it is also possible to use "[foo]".

Biçimleme seçenekleri hakkında daha fazla bilgi

Ara

Gezinti

  • Haberler
  • Makaleler
  • Kod Örnekleri
  • Anketler
  • Forumlar
  • Son gönderiler
  • Yazım Önerileri

Kullanıcı girişi

  • Yeni hesap yarat
  • Yeni şifre iste

Yeni forum konuları

  • Python-Tkinter basit düzeyde eğitim videoları (ing)
  • Pythonla Bir sitenin kaynak kodunu nasıl alabilirim
  • Yazı yönünü değiştirme
  • wxwidgets boa ve python
  • yeni bir site
more

Aktif forum başlıkları

  • Pythonla Bir sitenin kaynak kodunu nasıl alabilirim
  • wxwidgets boa ve python
  • Yazı yönünü değiştirme
  • Python-Tkinter basit düzeyde eğitim videoları (ing)
  • Tekrar Merhaba
more

Son yorumlar

  • kardeşim verdiğin kod olmuyo
    3 gün 4 saat önce
  • düzenli ifadeler ile bunu
    4 gün 1 saat önce
  • düzenli ifadeler ile bunu
    4 gün 1 saat önce
  • Lütfen Yardımcı olun bu benim
    4 gün 10 saat önce
  • teşekkür ederim bir şey daha
    4 gün 16 saat önce
  • bu işlemleri yaptım. wx ile
    6 gün 15 saat önce
  • Konsolda sırası ile aşağıdaki
    1 hafta 4 saat önce
  • işletim sistemim debian
    1 hafta 2 gün önce
  • #!/usr/bin/env
    1 hafta 3 gün önce
  • Yazan arkadaş kavramları
    3 hafta 13 saat önce

Kimler yeni

  • caglarsayin
  • cautlehefance
  • amoxyAnymncholo
  • irrismisybela
  • CompleX

Kimler çevrimiçi

Şu an 0 kullanıcı ve 1 ziyaretçi çevrimiçi.

İçerik paylaşımı

İçeriği paylaş

Powered by Drupal, an open source content management system

  • anasayfa
  • forumlar
  • gezegen
  • Üye ol

2008 - Python TR