11 Ekim 2008 Cumartesi

Google App Engine uygulama geliştirme 1

Son zamanlarda web programlama öğrenme azmimin sonunda galib geleceğimi ve bana çok uzak olan bu alanda kendime birşeyler katabileceğimi gösteriyor. Web programlama diyince akla gelen çatılara değiştirerek bir yenisini ekleyen ve iyiki olan Google'in APP ENGINE uygulaması ile web uygulamaları geliştirmeye bende başladım. Biraz araştırma, biraz deneme yanılma yöntemiyle mantığını azda olsa kavramış bulunmaktayım. App Engine yeni! djangoyu kullan, dökümasyonda sıkıntı çekersin veya sırf beleş hosting var o yüzden kullanıyorsun! diyenleri duyar gibiyim. Ne yalan söyleyim haklısınız ama önce aşağıdakileri okuyun.

  • 500 mb web alanı,

  • 9 tane app engine uygulaması açabilirsiniz ki bu toplamda 4500 mb'lık web alanı demek,

  • Aylık 5 milyon sayfa gösterimi için her App Engine uygulaması 500 mb'a kadar depo, yeterli band genişliği ve cpu kullanamı sağlıyor.

  • Uygulama version takip sistemi. Bunu alatmak zevkli olacak çünkü herkezin hoşuna gideceğine inanıyorum. Buraya bir yıldız atalım ve aşağıda anlatalım. *Version Takip

  • Google App Engine admin panelini unutmamış, istatistiklerin tutulduğu, version seçiminin yapılabildiği ve dilerseniz uygulamanıza varsa Domain adresinizle bütünleştirebilirsiniz. Bunlarla artı olarak milyonlarca tabloyu yönetmek için veri gösterim bölümü var(data viewer)... Uygulamanızın çalışma esnasındaki Log'larınızı takip edebilir ve hataları görebilirsiniz.

  • App Engine'nin bir özelliği daha çok hoşuma gidiyor. Henüz kullanmak nasip olmadı ama:D Admin panelini incelerseniz orada Developers yazan bir kısım var. Geliştiriciler bölümünde projenize istediğiniz kadar kullanıcıyı dahil edebilir ve ortak bir çatı altında uygulamalarınızı yönetebilirsiniz. Tek yapmanız gereken geliştirici olacak kişinin gmail adresini buraya yazmak.

  • Modeller,Template,Static dosyaları, kendi web uygulamaları için frameworkü ve en güzeli baştan aşağıya python ile web uygulamaları geliştirebileceğiniz açık kaynak kodlu güzel bir çalışma ortamı ve sağlayıcısı.


*Version Takip Açıklaması : Benim çok hoşuma giden ve sizinde çok hoşunuza gideceğine inandığım bir uygulamadan bahsedeceğim. Appengine'de ayar dosyasında şöyle birşey vardır.

application: gencistatistik
version: 2
runtime: python
api_version: 1


  • application kısmı uygulamamızın AppEngine'deki adını yazılıyor

  • runtime kısmı uygulamanın hangi dili kullandığını

  • api_version api versionudur. Bu kısmı pek anlamış değilim

  • version bu kısımda projenizi versionlara ayırabilirsiniz.

  • Örneğin bir blog uygulaması yapıyorsunuz. Geliştirdiğiniz blog uygulamanızı makinanızda google_appengine/dev_appserver.py sitem/ şeklinde test ettiniz hiç bir sorun yok, o zaman dediniz ki ben bunu geliştireceğim ve bunun üzerine gelişmiş versionlar koyacağım. Appengine size bu fırsatı tanıyor ve version kısmına 1 yazarsanız her alanınıza yüklediğinizde(google_appengine/appcfg.py update sitem/) 1 ve üstü versionlar olur. Diyelimki artık blog uygulamanız yeterince gelişti ve siz hataları görmek için 1 sürümünü kaldırmadan version kımına 2 yazdınız ve alanınıza yüklediniz. App Engine'de artık hem 1. ve hem 2. sürümler mevcut. Admin panelinden hangisini öntanımlı(default) version olarak seçerseniz o sürüm uygulama.appengine.com adresinde gözükür. Diğeri ise geliştiriciler tarafından test etmek amacı ile kullanılabilir. Süper değil mi? :D


    İştahınızın kabardığını düşünüyorum ve birazda icraat dediğinizi duyuyorum. Açıkcası bu yazıyı yazmadan 1 gün önce appengine ile merhabalaştım :D bir gün sonra küçük bir blog uygulaması yaptım.( http://gencistatistik.appspot.com/ ) Nereden başlıyacağınızı bilmiyorsanız pytr.org adresinde güzel referans olarak kabul ediyorum. Çok güzel bir anlatım tarzıyla konuyu özetlemişler, nasıl hesap alacağınızı, nereden başlıyacağınızı, kavramları ve başlangıç teknikleri. ( TIKLA )

    Django kullanan arkadaşlarımın çabuk adapte olacağına inanıyorum. Ben uygulamamda django kullanarak değil App Engine'nin kendi Framework'ünü kullanıyorum. Kendi blog adresimden bir örnek ile bitirmek hayırlı olacak uzadıkça uzuyor :D Öncelikle pytr.org adresindeki makaleleri okuduğunuzu varsayıyorum.
    Dosyanın içerik listesi.
    mysite
    ------>static
    ------>python
    -------------->templates
    ---------------------------->blogyaz.html
    ---------------------------->index.html
    -------------->hello.py
    ------>app.yaml
    Python dosyası sadece bir tane var. Bütün python kodları aynı yerde, parçalamadım.

    from google.appengine.ext import webapp
    from google.appengine.ext.webapp.util import run_wsgi_app
    from google.appengine.api import users
    from google.appengine.ext import db
    from google.appengine.ext.webapp import template
    #Blog uygulamamda kullanmak için tablolarım.
    class Blogum(db.Model):
    yazan = db.UserProperty()
    girdi = db.TextProperty()
    blogbaslik = db.StringProperty()
    date = db.DateTimeProperty(auto_now_add=True)

    class Karsilama(db.Model):
    yazan = db.UserProperty()
    yazi = db.StringProperty(multiline=True)
    date = db.DateTimeProperty(auto_now_add=True)

    Kısaca Blogum ve Karsilama tabloları oluşturdum. Appenginede djangoda olduğu gibi modeli oluşturmama gerek yok. İsterseniz çalışma anında dahi tablolara müdahale edebilirsiniz :D Karsilama gelen kişiye mesaj yazma veya algılama için oluşturdum. Tablolar çok basit olabilir ama buda bir örnek :D

    class AnaSayfa(webapp.RequestHandler):
    def get(self):
    bloglar = Blogum.all()
    bloglar.order("-date")
    kullanici = users.get_current_user()
    if kullanici:
    url = users.create_logout_url(self.request.uri)
    url_linktext = "Çıkış"
    else:
    url = users.create_login_url(self.request.uri)
    url_linktext = "Giriş"
    template_values = {
    "bloglar":bloglar,
    "url":url,
    "url_linktext":url_linktext,
    "kullanici":kullanici}
    path = os.path.join(os.path.dirname(__file__), 'templates/index.html')
    self.response.out.write(template.render(path, template_values))

    Class'larımız eğer biz appenginenin kendi web çatısını kullancaksak miras alıyoruz. Burada miras olarak webapp sınıfının fonksiyonu RequestHandler'i aldık. get fonksiyonunda yolluyor post fonksiyonu ile gelen veriyi yorumluyoruz. bloglar = Blogum.all() ile blogum tablosuna sorgu çekiyor ve order("-date") ile güncel tarihe göre sıralatıyoruz. (SQL nerde :D) Modeller ve alanları ile ilgili daha geniş bilgi için TIKLA burayı biraz kurcalayın.
    kullanici = users.get_current_user() burada Appenginenin Users Api'sini kullandık ve get_current_user() ile en basit söylem ile giren üye mi? öğrendik :D Üye ise çıkış yapmasını , üye değil ise google'ın giriş sayfasına yönlendirdik.

    Path dosyasında index.html dosyasının yerini aldık ve self.response.out.write(template.render(path, template_values)) ile template sözlüğündeki anahtarları index.html dosyamızda kullanmak üzere yolladık :D Artık html dosyamız ile işlemlerimize devam edebiliriz. Şimdilik bu kadar yeter sindirin ve kurcalayın html dosyalarımızda yolladığımız bu anahtarları nasıl kullandığımızı, static dosya mantığı, app.yaml dosyasının mantığı, admin paneli ve inşallah Appengine'deki uygulamamın içinde google api'lerinin nasıl kullanıldığını anlatacağım. Eksiğim yanlışım veya düzeltilmesi gereken bir yer, konu veya mantık hatası varsa lütfen uyarınız.

1 yorum:

  1. hocam baya bi kafa karıştırıcı bunlar ben vazgeçtim uygulama yazmaktan bunlar profesyonel işleri... :D

    YanıtlaSil