Skip to content

28 Mayıs 2009

4

Django Dersleri – 3: Google App Engine & Django

.

Google App Engine ilk çıktığında sadece Python desteklemekteydi. Fakat birkaç ay önce Java’ da desteklemeye başladı. Umarız ilerleyen zamanlarda diğer dilleri de destekler. Bu servis açık kaynak yazılım geliştirmek isteyenler için bulunmaz bir nimet. Özellikle Django‘nun büyüsüne kapılıp sonra da onu çalıştıracak ücretisiz :D bir sunucu bulamayan bizler için. Her sunucu django desteklemediği için ve django destekli sunucuların mailyetinin fazla olduğu için isteğiniz biraz kaçabilir. Ama Google App Engine bu konuda bize yardımıcı oluyor. Şimdi App Engine sunucumuzda nasıl django çalıştırabileceğimize bakalım. Burada bazı farklılıklarla karşılaşacağız. Bunlardan en önemlisi modellerdeki farklılıklar. Django’nun django.db.models.Model nesnesini kullanmıyoruz. Onun yerine google.appengine.ext.db.Model nesnesini kullanıyoruz. Metotlar birbirine yakın olduğu için alışmamız uzun sürmez. Bir de Gql diye birşey var. SQL’in Googlecası diyebiliriz. Bu kadar konuştuktan sonra kodlamaya geçebiliriz.

Bu kısma geçmeden önce App Engine kurulumu ile alakalı ön bilgi almak için şuradaki yazıyı okumanızı öneririm.

Klasik bir blog uygulaması yapalım.

django-blog isminde bir dizin oluşturup içine app.yaml dosyamızı oluşturalım. İçeriği şöyle olsun

application: django-blog
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
script: main.py

Ardından app.yaml dosyasının yanına main.py dosyasını oluşturuyoruz. İçeriği şöle olsun

import os, sys

from django.conf import settings
settings._target = None

os.environ["DJANGO_SETTINGS_MODULE"] = "blog.settings"
sys.path.append("E:\\app_engine\\django-blog")

from google.appengine.ext.webapp import util
from django.conf import settings

settings._target = None

import django.core.handlers.wsgi
import django.core.signals
import django.db
import django.dispatch.dispatcher

django.dispatch.dispatcher.disconnect(django.db._rollback_on_exception,django.core.signals.got_request_exception)

def main():
    application = django.core.handlers.wsgi.WSGIHandler()
    util.run_wsgi_app(application)

if __name__ == "__main__":
    main()

Burada 7. satırı biraz önce oluşturduğumuz django-blog dizininin yolunu yazıyoruz. 6. satır ise birazdan oluşturacağımız projenin adı. Yani django-admin.py startproject komutuyla oluşturacağımız proje.

Komut penceresini açıp django-blog dizinine geldikten sonra blog isminde bir django projesi başlatıyoruz.

django-admin.py startproject blog

Şimdi çalışıp çalışmadığını görmek için sunucumuzu çalıştırıyoruz.

dev_appserver.py django-blog/

Şimdi http://localhost:8080/ adresinden Congrulations sayfasını görüyoruz. Artık django çalışıyor. Eğer göremiyorsanız başa dönüp tekrar gözden geçirin.

Komut penceresinden django-blog/blog dizinine gelip blogum isminde bir uygulama başlatıyoruz.

python manage.py startapp blogum

Bu komutla birlikte blogum isminde bir dizin oluşacak. Bu dizinin içindeki models.py dosyasına modelimizi tanımlayalım.

from google.appengine.ext import db

class Yazi(db.Model):
yazan = db.UserProperty()
metin = db.StringProperty(multiline=True)

Modelde yazan ve metin olmak üzere iki elaman tanımladık.

Djangonun en sevdiğin kısmı olan urls.py dosyasını da şöyle yapıyoruz:

from django.conf.urls.defaults import *
from blog.blogum.views import index,ekle

urlpatterns = patterns('',
(r'^blog/$',index),
(r'^blog/ekle/$',ekle),
)

Burada /blog adresinde index fonksiyonunu ve /blog/ekle adresinde de ekle fonksiyonunu çağıracağını bilidiriyoruz. Buradaki urlpatterns değeri düzenli ifadeler(regular expressions ) kullanılarak oluşturuluyor. Düzenli ifadeler hakkında bilgi edinmek için şuraya ve şuraya bakabilirsiniz.

Aynı dizindeki views.py dosyasına da olayları yazıyoruz:

from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response
from google.appengine.ext import db
from google.appengine.api import users
from blog.blogum.models import Yazi

def index(request):
    yazilar = Yazi.all()
    yazilar = yazilar.fetch(1000)
    if users.get_current_user():
        url = users.create_logout_url(request.path)
        url_text = "Cikis"
    else:
        url = users.create_login_url(request.path)
        url_text = "Giris"
    sablon_param = {"yazilar":yazilar,"url":url,"url_text":url_text}
    return render_to_response("index.html",sablon_param)

def ekle(request):
    metin = request.POST["metin"]
    yazi = Yazi()
    yazi.metin = metin
    if users.get_current_user():
        yazi.yazan = users.get_current_user()
    yazi.put()
    return HttpResponseRedirect("/blog")

Burada iki fonksiyonumuz var biri index biri de ekle, index fonksiyonunda yazilari veritabanından okuyoruz. İlk 1000 yazıyı çekiyoruz.  1000 yazmamızın nedeni ise veritabanından veri okurken en fazla 1000 adet okuyabiliyoruz. Bu sınırlama App Engine tarafından yapılıyor.

users.get_current_user() fonksiyonu ile kullanıcının giriş yapıp yapmadığına bakıyoruz. Buradaki kullanıcı girişinden kasdımız Gmail hesabıyla giriştir. Lokalden çalıştırırken buraya giriş yapıp herhangi bir mail adresi yazabiliyorsunuz. Ama uygulamayı App Engine sunucularına yükledikten sonra Gooogle hesabıyla giriş yapılıyor.

Django’nun vazgeçilmezlerinden biri olan sablonları kullanıyoruz. Sablona parametrelerini girdikten sonra render_to_response komutuyla sablonu render ediyoruz.

ekle fonksiyonunda ise POST metoduyla gelen veriyi okuyoruz. Eğer kullanıcı giriş yaptıysa yazinin yazarı oluyor. Eğer yapmadıysa yazi.yazan değeri boş oluyor. Bunu da şablonumuzda sorgulatarak “anonim” olarak belirtiyoruz. Yani kullanıcı giriş yapmadan yazı yazarsa yazan kısmı anonim olarak görünüyor. put() fonksiyonuyla veritabanına yazdığımız veriyi ekliyoruz. Son olarak “/blog” sayfasına yönlendiriyoruz.

Şablon kullanmak için şablon dizinlerini djangoya belirtmemiz gerekiyor. Bunun için django-blog/blog/settings.py dosyasına bir ekleme yapacağız. Bu dosyada TEMPLATE_DIRS değişkenine şablon dosyamızın yolunu ekliyoruz. Ben djang0-blog/blog/blogum dizinin içine sablon isminde bir oluşturup index.html dosyasını oraya koydum. O zaman değişikliği şöyle yapıyoruz:

TEMPLATE_DIRS = (
"e:\\app_engine\\django-blog\\blog\\blogum\\sablon"
)

sablon dizinin içine index.html dosyasını oluşturuyoruz.

<a href ="{{ url }}">{{ url_text }}</a>
<h1>Blog</h1>
{% for yazi in yazilar %}
{% if yazi.yazan %}
{{ yazi.yazan.nickname }}
{% else %}
anonim
{% endif %}
<blockquote>{{ yazi.metin|escape }}</blockquote>
{% endfor %}

<form action="/blog/ekle/" method="post">
<textarea name="metin" rows="3" cols="40"></textarea>
<input type="submit" value="Gönder">
</form>

Burada kullanıcının giriş yapıp yapmadığına bakarak giriş veya çıkış linklerini koyuyoruz. Ardında sablonda belirttiğimiz yazilar değerini bir for döngüsüyle okuyup ekrana yazdırıyoruz. Oluşturduğumuz form ile “/blog/ekle/” adresine post metoduyla yazdığımız yazının gönderilmesini sağlıyoruz.

Veritabanındaki verilerin tamamını silmek için sunucuyu şu komutla başlatıyoruz:

dev_appserver.py –clear_datastore django-blog/

Hepsi bu kadar, kolay gelsin…

İlgili Yazılar

4 Comments Post a comment
  1. Haz 12 2009

    tşkler

  2. zeliha
    Mar 13 2010
  3. zeliha
    Mar 13 2010

    bu hatayı aldım yardımcı olur musunuz nerede hata yaptığımı bulamaıyorum

  4. admin
    Mar 17 2010

    Hangi hata

Share your thoughts, post a comment.

(required)
(required)

Note: HTML is allowed. Your email address will never be published.

Subscribe to comments