<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ftoptas blog &#187; google app engine</title>
	<atom:link href="http://ftoptas.com/category/app-engine/feed/" rel="self" type="application/rss+xml" />
	<link>http://ftoptas.com</link>
	<description>[beta]</description>
	<lastBuildDate>Mon, 30 Jan 2012 20:19:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>İÜ-RSS: Elektrik-Elektronik Müh. Duyuruları RSS Adresi</title>
		<link>http://ftoptas.com/iu-rss-elektrik-elektronik-muh-duyurulari-rss-adresi/</link>
		<comments>http://ftoptas.com/iu-rss-elektrik-elektronik-muh-duyurulari-rss-adresi/#comments</comments>
		<pubDate>Sat, 22 Jan 2011 13:31:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[google app engine]]></category>
		<category><![CDATA[google-app-engine]]></category>
		<category><![CDATA[iu-rss]]></category>

		<guid isPermaLink="false">http://ftoptas.com/?p=412</guid>
		<description><![CDATA[Bölümümün sayfasındaki duyuruları okumak için]]></description>
			<content:encoded><![CDATA[<p><a href="http://ee.istanbul.edu.tr/anasayfa.html" target="_blank"><img class="size-full wp-image-413 alignright" title="iu-rss" src="http://ftoptas.com/wp-content/uploads/2011/01/iu-rss.jpg" alt="" width="200" height="200" />Bölümümün </a>sayfasındaki duyuruları okumak için neden bir RSS ouşturdum? Bu sorunun cevabı, aşağıdan yukarı doğru kayan duyuruların en yakın tarihli olanı, sayfa açıldıktan birkaç milisaniye sonra kaybolması ve okumak için kayan yazıların birinci turu bitirip ikinci tura başlamasını beklemek. Her seferinde daha hızlı okumak için arşive girmem gerekiyordu. Ben de hemen kolları sıvayıp sadece<strong> 2.3 KB</strong> boyutunda olan bir python betiği yazıp <a href="http://code.google.com/intl/tr/appengine/" target="_blank">GAE </a>üzerinde çalıştırmaya başladım. Kod basit bir web scraper olarak çalışıyor ve çektiği verileri işleyip RSS formatına çeviriyor. Şimdi keyifle Google Reader&#8217;da gelen duyuruları inceliyorum. Siz de <a href="http://iu-rss.appspot.com/" target="_blank">iu-rss.appspot.com</a> adresinden ulaşabilirsiniz.</p>
<p><strong>Güncelleme</strong></p>
<p>Artık sınav sonuçları da RSS olarak izlenebiliyor ilgilere duyurulur.</p>
]]></content:encoded>
			<wfw:commentRss>http://ftoptas.com/iu-rss-elektrik-elektronik-muh-duyurulari-rss-adresi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google App Engine ile Alexa Rank Değerini Okuma &#8211; urlfetch fonksiyonu</title>
		<link>http://ftoptas.com/google-app-engine-ile-alexa-rank-degerini-okuma-urlfetch-fonksiyonu/</link>
		<comments>http://ftoptas.com/google-app-engine-ile-alexa-rank-degerini-okuma-urlfetch-fonksiyonu/#comments</comments>
		<pubDate>Thu, 24 Sep 2009 13:18:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[google app engine]]></category>
		<category><![CDATA[alexa rank]]></category>
		<category><![CDATA[urlfetch]]></category>

		<guid isPermaLink="false">http://ftoptas.com/?p=321</guid>
		<description><![CDATA[Bugünlerde sitemin alexa rank değeri]]></description>
			<content:encoded><![CDATA[<p>Bugünlerde sitemin alexa rank değeri aniden 2 katından fazla artınca biraz kafayı taktım. Derken Google App Engine ile değeri okumaya çalıştım ve sizinle paylaşıyorum.</p>
<p>Bu yazıyı okumaya devam etmeden önce <a href="http://ftoptas.com/google-app-engine-ile-uygulama-gelistirme/" target="_blank">şuradaki</a> yazımı okumanızı öneriyorum.</p>
<p>Önce alexa isminde bir çalışma dizini oluşturuyoruz. Bu dizinin içine app.yaml isminde bir dosya oluşturuyoruz. Dosyanın içeriğini şöyle yapıyoruz:</p>
<pre name="code" class="python">application: alexa-rank-ogren
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
script: main.py</pre>
<p><span id="more-321"></span></p>
<p>İlk satırdaki alexa-rank-ogren degeri <a href="http://appengine.google.com" target="_blank">appengine.google.com</a> adresine girip Create an Application dedikten sonra girdiğimiz Application Identifier değeri olmalıdır.</p>
<p>Şimdi de burada belirttiğmiz <span style="color: #0000ff;">main.py</span> dosyasını da <span style="color: #0000ff;">app.yaml</span> dosyasının yanına oluşturuyoruz.<span style="color: #0000ff;"> main.py</span> dosyası da şöyle olsun:</p>
<pre name="code" class="python">from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import urlfetch
import re,urllib

class MainPage(webapp.RequestHandler):
    def get(self,url):
        self.response.headers['Content-Type'] = 'text/plain'
        url = 'http://www.alexa.com/siteinfo/'+ url
        try:
            content = urlfetch.fetch(url).content
            up = re.search('&lt;img src="/images/icons/globe-sm.jpg" alt="Global" style="margin-bottom:-2px;"/&gt; [0-9,]{1,10}&lt;/a&gt;',content)
            up = re.search('[0-9,]{1,10}&lt;/a&gt;',up.group()).group()
            sonuc = up[0:-4]
        except:
            sonuc = 'hata'
        self.response.out.write(sonuc)

application = webapp.WSGIApplication([(r'/(.*)',MainPage)],debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()</pre>
<p>Burada önce <span style="color: #008000;">MainPage</span> isminde bir sınıf oluşturduk ardından sınıfın içinde oluşturduğumuz get fonksiyonu ile sayfaya gelen istek sonucunda sayfanın gösterdiği değeri belirleyeceğiz. Bu fonksiyonun bir parametresi olan url şu şekilde okunuyor:</p>
<p>http://alexa-rank-ogren.appspot.com/<span style="color: #008000;">ftoptas.com</span></p>
<p>Bu adresteki<span style="color: #008000;"> ftoptas.com</span> kısmı urlyi oluşturmaktadır. Çünkü sadece bir parametremiz var o da ilk<span style="color: #008000;"> &#8216;/&#8217; </span>karakterinden sonra gelen kısımdır.</p>
<p>alexa rank değerini okuyacağımız siteyi öğrendik şimdi de alexaya bağlanıyoruz. Sitenin alexa rank değeri de</p>
<p>http://www.alexa.com/siteinfo/ftoptas.com adresindedir.</p>
<p><span style="color: #008000;">urlfetch() </span>fonksiyonuyla bu siteyi çekiyoruz. Yaklaşık olarak 26KB&#8217;lik bir dosya. Şimdi bir düzenli ifade yazarak bu 26KB&#8217;lik dosyanın içinden sadece alexa rank değerini alacağız.</p>
<p>Eğer FireBug ile bu sayfayı incelersek alexa rank değerinin olduğu yerdeki kodlar şöyledir:</p>
<pre>&lt;img src="/images/icons/globe-sm.jpg" alt="Global" style="margin-bottom:-2px;"/&gt; 4,274,049&lt;/a&gt;</pre>
<p>Bu ifadeyi 12. satırda buluyoruz ve 13.satırda ikinci defa düzenli ifade (regex) kullanarak buradaki sayıyı çekiyoruz.</p>
<p>try kullanmamızın nedeni ise olmayan bir url girdiğimizde bize &#8216;hata&#8217; değerini döndürmesi içindir.</p>
<p>Oluşturduğumuz WSGIApplication parametrelerinde ise urllerin nasıl olacağını belirttik. Yani hangi fonksiyonun hangi url ile bağlantılı olacağını yazdık.</p>
<p>Burada <span style="color: #008000;">&#8216;/&#8217;</span> yerine <span style="color: #008000;"> r&#8217;/(.*)&#8217;</span> kullanmamızın nedeni ise http://alexa-rank-ogren.appspot.com/ adresinden sonra bir parametre geleceğini belirtmek.</p>
<p>Eğer http://alexa-rank-ogren.appspot.com/alexa/ftoptas.com urlsini kullandığımızda <span style="color: #008000;">MainPage </span>fonksiyonunu çağırmak isteseydik şu ifadeyi kullanırdık:</p>
<p><span style="color: #008000;">r&#8217;/alexa/(.*)&#8217;</span></p>
<p>veya MainPage fonksiyonunda iki parametre kullanmak isteseydik şöyle yapardık:</p>
<p><span style="color: #008000;">r&#8217;/(.*)/(.*)&#8217;</span></p>
<p>Yani regex kullanarak çok esnek urller oluşturabiliriz.</p>
<p>Gördüğünüz gibi 26KB&#8217;lik bir veriyi kendi sunucunuzda çekip işlemek hem trafiği hem de işlemci yükünü arttırır. Google app engine kullanarak bu yükü google sunucuların yükledik.  Sistemin çalışan halini şu adreslerden test edebilirsiniz.</p>
<p><a href="http://f-toptas.appspot.com/alexa/google.com" target="_blank">http://f-toptas.appspot.com/alexa/google.com</a></p>
<p><a href="http://f-toptas.appspot.com/alexa/ftoptas.com">http://f-toptas.appspot.com/alexa/ftoptas.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ftoptas.com/google-app-engine-ile-alexa-rank-degerini-okuma-urlfetch-fonksiyonu/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Pardus&#8217;a Google App Engine Kurulumu</title>
		<link>http://ftoptas.com/pardusa-google-app-engine-kurulumu/</link>
		<comments>http://ftoptas.com/pardusa-google-app-engine-kurulumu/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 11:59:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[google app engine]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://ftoptas.com/?p=242</guid>
		<description><![CDATA[Önceki yazılarımda Google App Engine&#8217;den]]></description>
			<content:encoded><![CDATA[<p>Önceki yazılarımda Google App Engine&#8217;den biraz bahsetmiştim. Kodlarımızı GAE sunucularına yüklemek için veya yerelde çalıştırmak için bir uygulama kullanıyoruz. Windwos için bu uygulama bir .exe dosyası ve çalıştırıp kuruyoruz. Burada sorun yok. Fakat bu uygulamanın Linux versiyonu ise bir .zip dosyası. Bunu nasıl kullanacağımızı görelim:</p>
<p>1. Adım: Uygulamayı indirelim:</p>
<p><a href="http://code.google.com/intl/tr-TR/appengine/downloads.html" target="_blank">şuradan</a> google_appengine_1.2.3.zip dosyasını indiriyoruz.</p>
<p>2. Adım: indirdiğimiz zip dosyasını açıp <span style="color: #000080;">/home/faruk/gae</span> (burada &#8216;faruk&#8217; yerine sizin kullanıcı adınız gelecek) dizinine kopyalıyoruz. Bu kısmı isterseniz sağ tıklayıp buraya çıkar diyerek veya komutlarla şöyle yapabilirsiniz:</p>
<p><span id="more-242"></span></p>
<pre class="python">unzip google_apengine_1.2.3.zip
cp -R googgle_appengine /home/faruk/gae</pre>
<p>Sıkıştırılmış dosyayı açıp /home/faruk/gae dizinine kopyaladık. Uygulamamız bu dizine kurulmuş oldu.</p>
<p>3.Adım: Şimdi de çalışacağımız dizinin içine buradan bir symlink oluşturalım. Çalışacağımız dizin /home/faruk/Desktop/projelerim/ olsun. Şu kodları yazarak symlink oluşturuyoruz:</p>
<pre class="python">sudo ln -s /home/faruk/gae /home/faruk/Desktop/projelerim/gae</pre>
<p>4.Adım: Şimdi tekrar projelerim dizinine dönerek burada herhangi bir GAE uygulaması yapabilirz. Hemen küçük bir uygulama yapalım. Önce deneme isminde bir dizin açalım:</p>
<pre>mkdir deneme</pre>
<p>Bu dizinin içine app.yaml ve main.py dosyalarımızı oluşturalım:</p>
<p>app.yaml:</p>
<pre>application: deneme
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
  script: main.py</pre>
<p>main.py:</p>
<pre class="python">from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class MainPage(webapp.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.out.write('Merhaba Pardus')

application = webapp.WSGIApplication([('/',MainPage)],debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()</pre>
<p>Şimdi tekrar projelerim dizinine gelerek şu komutları yazalım:</p>
<pre>sudo python gae/dev_appserver.py deneme</pre>
<p>Firefoxu açıp localhost:8080/ adresine girdiğimizde Merhaba Pardus yazısını görüyoruz. Hayırlı olsun&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://ftoptas.com/pardusa-google-app-engine-kurulumu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Django Dersleri &#8211; 3: Google App Engine &amp; Django</title>
		<link>http://ftoptas.com/django-dersleri-3-google-app-engine-django/</link>
		<comments>http://ftoptas.com/django-dersleri-3-google-app-engine-django/#comments</comments>
		<pubDate>Thu, 28 May 2009 11:30:37 +0000</pubDate>
		<dc:creator>ceyranci</dc:creator>
				<category><![CDATA[django]]></category>
		<category><![CDATA[google app engine]]></category>
		<category><![CDATA[django dersleri]]></category>

		<guid isPermaLink="false">http://ftoptas.wordpress.com/?p=224</guid>
		<description><![CDATA[Google App Engine ilk çıktığında]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/intl/tr-TR/appengine/" target="_blank">Google App Engine</a> ilk çıktığında sadece Python desteklemekteydi. Fakat birkaç ay önce Java&#8217; 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 <a href="http://www.djangoproject.com" target="_blank">Django</a>&#8216;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&#8217;nun <span style="color:#0000ff;">django.db.models.Model</span> nesnesini kullanmıyoruz. Onun yerine <span style="color:#0000ff;">google.appengine.ext.db.Model</span> 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&#8217;in Googlecası diyebiliriz. Bu kadar konuştuktan sonra kodlamaya geçebiliriz.</p>
<p>Bu kısma geçmeden önce App Engine kurulumu ile alakalı ön bilgi almak için <a href="http://ftoptas.com/google-app-engine-ile-uygulama-gelistirme/" target="_blank">şuradaki</a> yazıyı okumanızı öneririm.</p>
<p>Klasik bir blog uygulaması yapalım.</p>
<p><span id="more-224"></span></p>
<p><span style="color:#008000;">django-blog</span> isminde bir dizin oluşturup içine <span style="color:#008000;">app.yaml</span> dosyamızı oluşturalım. İçeriği şöyle olsun</p>
<pre class="python">application: django-blog
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
script: main.py</pre>
<p>Ardından <span style="color:#008000;">app.yaml</span> dosyasının yanına <span style="color:#008000;">main.py</span> dosyasını oluşturuyoruz. İçeriği şöle olsun</p>
<pre class="python">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()</pre>
<p>Burada 7. satırı biraz önce oluşturduğumuz <span style="color:#008000;">django-blog</span> 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.</p>
<p>Komut penceresini açıp <span style="color:#008000;">django-blog</span> dizinine geldikten sonra <span style="color:#008000;">blog</span> isminde bir django projesi başlatıyoruz.</p>
<p><span style="color:#0000ff;">django-admin.py startproject blog</span></p>
<p>Şimdi çalışıp çalışmadığını görmek için sunucumuzu çalıştırıyoruz.</p>
<p><span style="color:#0000ff;">dev_appserver.py django-blog/</span></p>
<p>Şimdi <span style="color:#008000;">http://localhost:8080/</span> 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.</p>
<p>Komut penceresinden <span style="color:#008000;">django-blog/blog</span> dizinine gelip <span style="color:#008000;">blogum</span> isminde bir uygulama başlatıyoruz.</p>
<p><span style="color:#0000ff;">python manage.py startapp blogum</span></p>
<p>Bu komutla birlikte <span style="color:#008000;">blogum</span> isminde bir dizin oluşacak. Bu dizinin içindeki <span style="color:#008000;">models.py</span> dosyasına modelimizi tanımlayalım.</p>
<pre class="python">from google.appengine.ext import db

class Yazi(db.Model):
yazan = db.UserProperty()
metin = db.StringProperty(multiline=True)</pre>
<p>Modelde <span style="color:#008000;">yazan</span> ve<span style="color:#008000;"> metin</span> olmak üzere iki elaman tanımladık.</p>
<p>Djangonun en sevdiğin kısmı olan <span style="color:#008000;">urls.py</span> dosyasını da şöyle yapıyoruz:</p>
<pre class="python">from django.conf.urls.defaults import *
from blog.blogum.views import index,ekle

urlpatterns = patterns('',
(r'^blog/$',index),
(r'^blog/ekle/$',ekle),
)</pre>
<p>Burada <span style="color:#008000;">/blog</span> adresinde <span style="color:#008000;">index</span> fonksiyonunu ve <span style="color:#008000;">/blog/ekle</span> adresinde de <span style="color:#008000;">ekle</span> fonksiyonunu çağıracağını bilidiriyoruz. Buradaki <span style="color:#008000;">urlpatterns</span> değeri düzenli ifadeler(regular expressions ) kullanılarak oluşturuluyor. Düzenli ifadeler hakkında bilgi edinmek için <a href="http://docs.djangoproject.com/en/dev/topics/http/urls/" target="_blank">şuraya</a> ve <a href="http://www.ceviz.net/duzenli-ifadeler-giris_a258.html" target="_blank">şuraya</a> bakabilirsiniz.</p>
<p>Aynı dizindeki <span style="color:#008000;">views.py </span>dosyasına da olayları yazıyoruz:</p>
<pre class="python">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")</pre>
<p>Burada iki fonksiyonumuz var biri <span style="color:#008000;">index</span> biri de<span style="color:#008000;"> ekle</span>, 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.</p>
<p><span style="color:#0000ff;">users.get_current_user()</span> 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.</p>
<p>Django&#8217;nun vazgeçilmezlerinden biri olan sablonları kullanıyoruz. Sablona parametrelerini girdikten sonra <span style="color:#0000ff;">render_to_response</span> komutuyla sablonu render ediyoruz.</p>
<p>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 &#8220;anonim&#8221; olarak belirtiyoruz. Yani kullanıcı giriş yapmadan yazı yazarsa yazan kısmı anonim olarak görünüyor.<span style="color:#0000ff;"> put() </span>fonksiyonuyla veritabanına yazdığımız veriyi ekliyoruz. Son olarak <span style="color:#008000;">&#8220;/blog</span>&#8221; sayfasına yönlendiriyoruz.</p>
<p>Şablon kullanmak için şablon dizinlerini djangoya belirtmemiz gerekiyor. Bunun için<span style="color:#008000;"> django-blog/blog/settings.py</span> dosyasına bir ekleme yapacağız. Bu dosyada <span style="color:#0000ff;">TEMPLATE_DIRS</span> değişkenine şablon dosyamızın yolunu ekliyoruz. Ben <span style="color:#008000;">djang0-blog/blog/blogum</span> dizinin içine <span style="color:#008000;">sablon</span> isminde bir oluşturup <span style="color:#008000;">index.html</span> dosyasını oraya koydum. O zaman değişikliği şöyle yapıyoruz:</p>
<pre class="python">TEMPLATE_DIRS = (
"e:\\app_engine\\django-blog\\blog\\blogum\\sablon"
)</pre>
<p>sablon dizinin içine <span style="color:#008000;">index.html</span> dosyasını oluşturuyoruz.</p>
<pre class="html">&lt;a href ="{{ url }}"&gt;{{ url_text }}&lt;/a&gt;
&lt;h1&gt;Blog&lt;/h1&gt;
{% for yazi in yazilar %}
{% if yazi.yazan %}
{{ yazi.yazan.nickname }}
{% else %}
anonim
{% endif %}
&lt;blockquote&gt;{{ yazi.metin|escape }}&lt;/blockquote&gt;
{% endfor %}

&lt;form action="/blog/ekle/" method="post"&gt;
&lt;textarea name="metin" rows="3" cols="40"&gt;&lt;/textarea&gt;
&lt;input type="submit" value="Gönder"&gt;
&lt;/form&gt;</pre>
<p>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 <span style="color:#008000;">&#8220;/blog/ekle/&#8221;</span> adresine post metoduyla yazdığımız yazının gönderilmesini sağlıyoruz.</p>
<p>Veritabanındaki verilerin tamamını silmek için sunucuyu şu komutla başlatıyoruz:</p>
<p><span style="color: #0000ff;">dev_appserver.py &#8211;clear_datastore django-blog/</span></p>
<p>Hepsi bu kadar, kolay gelsin&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://ftoptas.com/django-dersleri-3-google-app-engine-django/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Google App Engine ile Uygulama Geliştirme</title>
		<link>http://ftoptas.com/google-app-engine-ile-uygulama-gelistirme/</link>
		<comments>http://ftoptas.com/google-app-engine-ile-uygulama-gelistirme/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 17:36:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[django]]></category>
		<category><![CDATA[google app engine]]></category>
		<category><![CDATA[app engine kurulumu]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://ftoptas.wordpress.com/?p=218</guid>
		<description><![CDATA[Bugün Google App Engine ile]]></description>
			<content:encoded><![CDATA[<p>Bugün Google App Engine ile biraz uğraşayım dedim. Gerçekten çok hoşuma giti. Guestbook tutorial&#8217;ini sonuna kadar okudum ve uyguladım. Sadece 1.5 KB&#8217;lık bir Python betiği sonucunda ortaya çıkan uygulama gayet şaşırtıcı. Gmail hesabınızla giriş yapıp yazı yazılabileceğiniz bir ziyaretçi defteri. Eğer python ile uygulama geliştriyorsanız veya böyle bir fikriniz varsa şiddetle tavsiye ederim. En çok beğendiğim kısmı ise Django kurabilmemiz. Ayrıca bir proje birden fazla kullanıcı tarafından geliştirilebiliyor. Bir proje için 500 MB alan veriyor (beleş tarifede) . Trafik, CPU kullanımı vs. gibi bazı özellikleri arttırmak istediğimizde ise para ödemek zorunda kalıyoruz. Küçük ve orta ölçekte uygulamalar için para ödemeden kullanılabilir gibi görünüyor.</p>
<p>Kısaca nasıl kullanıldığını anlatayım.</p>
<ul>
<li><a href="http://code.google.com/appengine/" target="_blank">şuradan</a> Google App Engine&#8217;e gmail hesabınızla üye oluyorsunuz. Sms ile aktivasyon yapmanız gerekiyor.</li>
<li><a href="http://appengine.google.com/" target="_blank">şuradan</a> Create an Application dedikten sonra bir uygulama oluşturuyoruz. Bir gmail hesabıyla 10 toplam 10 adet uygulama oluşturabiliyoruz.</li>
<li><a href="http://code.google.com/appengine/downloads.html" target="_blank">şuradan</a> Google App Engine SDK&#8217;yı indirip kuruyoruz.</li>
<li><a href="http://code.google.com/appengine/docs/" target="_blank">şuradan</a> dökümantasyonu okuyup nasıl başlayacağımızı öğreniyoruz.</li>
</ul>
<p><span id="more-218"></span></p>
<p>Tutorialdaki örneği birlikte yapalım:</p>
<ul>
<li><span style="color:#800000;">helloworld</span> isminde bir dizin oluşturup içine <span style="color:#800000;">app.yaml</span> isminde bir dosya oluşturalım ve içeriği şöyle olsun:</li>
</ul>
<pre class="python">application: helloworld
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
  script: helloworld.py</pre>
<ul>
<li>Yukarıda projemizi tanımlayan bir dosya oluşturduk. Uygulama ismi <span style="color:#800000;">helloworld</span>, versiyonu <span style="color:#800000;">1</span>, çalışma ortamı <span style="color:#800000;">python</span>, api versiyonu <span style="color:#800000;">1</span> ve /* adresinin kaynak dosyası da <span style="color:#800000;">helloworld.py</span></li>
<li><span style="color:#800000;">helloworld</span> dizininin içine <span style="color:#800000;">helloworld.py</span> isminde bir dosya oluşturup içeriğini şöyle yapalım:</li>
</ul>
<pre class="python">print 'Content-Type: text/plain'
print ''
print 'Hello, world!'</pre>
<ul>
<li>DOS komut isteminden <span style="color:#800000;">dev_appserver.py helloworld/</span> komutunu verip sunucumuzu çalıştıralım. Bu komutu yazarken <span style="color:#800000;">helloworld</span> dizininin bir üst dizininde olmalıyız.</li>
<li>Web tarayıcımızdan <span style="color:#800000;">http://localhost:8080/</span> yazdıktan sonra kodlarımızın çalıştığını görebiliriz. Ekranda sadece bir <span style="color:#0000ff;">Hello, world!</span> görüyoruz.</li>
<li>Uygulamamızı sunucuya yüklemeden önce app.yaml dosyasındaki <span style="color:#800000;">application: helloworld</span> satırını değiştirmemiz lazım. <span style="color:#800000;">helloworld</span> yerine kaydolurken belirlediğimiz projenin ismini yazalım.</li>
<li>Yaptıklarımızı App Engine sunucularına yüklemek için komut isteminden <span style="color:#800000;">appcfg.py update helloworld/</span> yazdığımızda bizden gmail kullanıcı adını ve parolasını sorduktan sonra yükleyecektir.</li>
<li><span style="color:#800000;">uygulama-adi.appspot.com</span> adresinden uygulamanızı görebilirsiniz.</li>
</ul>
<p>Ayrıntılı dökümantasyon için şuraya bakabilirsiniz. Ama önce şu sayfalara bakmanızı tavsiye ederim: <a href="http://code.google.com/appengine/docs/python/gettingstarted/introduction.html">giriş</a>, <a href="http://code.google.com/appengine/docs/python/gettingstarted/devenvironment.html">geliştirme ortamı</a>, <a href="http://code.google.com/appengine/docs/python/gettingstarted/helloworld.html">merhaba dünya</a>, <a href="http://code.google.com/appengine/docs/python/gettingstarted/usingwebapp.html">webapp çatısının kullanımı</a>, <a href="http://code.google.com/appengine/docs/python/gettingstarted/usingusers.html">kullanıcı servisleri</a>, <a href="http://code.google.com/appengine/docs/python/gettingstarted/handlingforms.html">webapp formları</a>, <a href="http://code.google.com/appengine/docs/python/gettingstarted/usingdatastore.html">datastore kullanımı</a>, <a href="http://code.google.com/appengine/docs/python/gettingstarted/templates.html">şablon kullanımı</a>, <a href="http://code.google.com/appengine/docs/python/gettingstarted/staticfiles.html">statik dosya kullanımı</a>, <a href="http://code.google.com/appengine/docs/python/gettingstarted/uploading.html">uygulamayı yükleme</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://ftoptas.com/google-app-engine-ile-uygulama-gelistirme/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

