<?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; python</title>
	<atom:link href="http://ftoptas.com/category/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://ftoptas.com</link>
	<description>[beta]</description>
	<lastBuildDate>Sun, 05 Sep 2010 21:27:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Python ile FTP işlemleri</title>
		<link>http://ftoptas.com/python-ile-ftp-islemleri/</link>
		<comments>http://ftoptas.com/python-ile-ftp-islemleri/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 19:30:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[ftplib]]></category>
		<category><![CDATA[pys60]]></category>
		<category><![CDATA[upload]]></category>

		<guid isPermaLink="false">http://ftoptas.com/?p=345</guid>
		<description><![CDATA[Dün cep telefonumdan(eski toprak N6600)]]></description>
			<content:encoded><![CDATA[<p>Dün cep telefonumdan(eski toprak N6600) ftp ile dosya göndermeye çalışırken kullandığım python scriptini sizinle paylaşmak istiyorum. Burada yazacağımız kodları ister bilgisayarınızdan ister Python destekleyen telefonunuzdan çalıştırabilirsiniz. Yapacağımız örneklerin kaynak dosyasını <a href="http://ftoptas.com/wp-content/plugins/download-monitor/download.php?id=1">buradan </a>indirebilirsiniz.</p>
<p>Önce ftplib kütüphanesine sahip olup olmadığımızı anlamak için aşağıdaki kodu yazalım.</p>
<p><span id="more-345"></span></p>
<pre name="code" class="python">
import ftplib
</pre>
<p>eğer hata vermediyse sorun yok devam edebiliriz.</p>
<pre name="code" class="python">
from ftplib import FTP
host= 'ftp.ftoptas.com'
kullanici_adi = 'kullanici'
parola = 'bir-iki-uc'
ftp = FTP(host)
ftp.set_pasv('true')
ftp.login(kullanici_adi,parola)
</pre>
<p>Belirttiğimiz parametreler sonucunda FTP sunucusuna bağlandık. Şimdi bulunduğumuz dizindeki dosya ve dizinleri listeleyelim</p>
<pre name="code" class="python">
ftp.retrlines('LIST')
</pre>
<p>Şimdi de bulunduğumuz dizini değiştirelim</p>
<pre name="code" class="python">
ftp.cwd('app')
</pre>
<p>Bulunduğumuz dizinden herhangi bir dosya indirelim</p>
<pre name="code" class="python">
dosya = 'test.txt'
ftp.retrbinary('RETR '+dosya,open(dosya,'wb').write)
</pre>
<p>veya bir dosya upload edelim</p>
<pre name="code" class="python">
dosya_adi = 'tes2t.txt'
dosya = open(dosya_adi,'r')
ftp.storbinary('STOR '+dosya_adi,dosya,1024)
dosya.close()
</pre>
<p>Son olarak açtığımız FTP bağlantısını kapatalım</p>
<pre name="code" class="python">
ftp.quit()
</pre>
]]></content:encoded>
			<wfw:commentRss>http://ftoptas.com/python-ile-ftp-islemleri/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>2</slash:comments>
		</item>
		<item>
		<title>Python ile MySQL Bağlantısı ve Temel İşlemler</title>
		<link>http://ftoptas.com/python-ile-mysql-baglantisi-ve-temel-islemler/</link>
		<comments>http://ftoptas.com/python-ile-mysql-baglantisi-ve-temel-islemler/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 13:02:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[bağlanma]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysqldb]]></category>
		<category><![CDATA[python dersleri]]></category>
		<category><![CDATA[veritabanı]]></category>

		<guid isPermaLink="false">http://ftoptas.com/?p=305</guid>
		<description><![CDATA[Python ile MySQLe bağlanmak için]]></description>
			<content:encoded><![CDATA[<p><img src="http://ftoptas.com/wp-content/uploads/2009/09/python-mysql.jpg" alt="python-mysql" title="python-mysql" width="300" height="124" class="aligncenter size-full wp-image-306" /><br />
Python ile MySQLe bağlanmak için önce MySQLdb kütüphanesini <a href="http://sourceforge.net/projects/mysql-python/" target="_blank">şuradan</a> indirip kuralım. Kütüphanenin doğru çalışıp çalışmadığını kontrol etmek için pythonu açıp kütüphaneyi import etmeye çalışalım.</p>
<pre name="code" class="python">
import MySQLdb
</pre>
<p>Eğer problem yoksa devam edebiliriz. Önce veritabanına bağlanmak için sunucu, kullanıcı adı, parola ve veritabanı ismini girelim.</p>
<pre name="code" class="python">
import MySQLdb
db = MySQLdb.connect(host="localhost",user="root",passwd="par01a",db="python")
cursor = db.cursor()
</pre>
<p>şimdi istediğimiz sorguları yazabiliriz.<br />
<span id="more-305"></span></p>
<pre name="code" class="python">
cursor.execute("select * from users")
result = cursor.fetchall()
</pre>
<p>Eğer tablodan birkaç eleman çekmek istiyorsak fetchall() yerine fetchmany() kullanabiliriz.</p>
<pre name="code" class="python">
result = cursor.fetchmany(3)
</pre>
<p>Tablodaki satır sayısını öğrenmek için</p>
<pre name="code" class="python">
cursor.rowcount
</pre>
<p>Veritabanına bilgi girmek için</p>
<pre name="code" class="python">
s = """insert into users (username, password) values ("yeni-kullanici","yeni-sifre")"""
cursor.execute(s)
</pre>
<p>en son eklenen girdinin id numarasını öğrenmek için</p>
<pre name="code" class="python">
cursor.lastrowid
</pre>
<p>Eğer veritabanına tek seferde birden fazla veri eklemek istiyorsak şu yöntemi kullanabiliriz:</p>
<pre name="code" class="python">
s = "insert into users (username, password) values (%s,%s)"
cursor.executemany(s,[("ali","alininparolali"),("veli","velininparolası"),("ayşe","ayşeninparolası")])
</pre>
<p>Son olarak da işimiz bittikten sonra bağlantıyı kapatıyoruz.</p>
<pre name="code" class="python">
cursor.close()
db.close()
</pre>
<p>Kolay gelsin&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://ftoptas.com/python-ile-mysql-baglantisi-ve-temel-islemler/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PyS60 ile SMS Yedekleme</title>
		<link>http://ftoptas.com/pys60-ile-sms-yedekleme/</link>
		<comments>http://ftoptas.com/pys60-ile-sms-yedekleme/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 04:18:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[pys60]]></category>
		<category><![CDATA[inbox]]></category>
		<category><![CDATA[pys60 dersleri]]></category>
		<category><![CDATA[sms yedekleme]]></category>

		<guid isPermaLink="false">http://ftoptas.com/?p=297</guid>
		<description><![CDATA[Eğer smslerinizi silmek istemiyorsanız ve]]></description>
			<content:encoded><![CDATA[<p><img src="http://ftoptas.com/wp-content/uploads/2009/09/pysms.jpg" alt="pysms" title="pysms" width="400" height="200" class="aligncenter size-full wp-image-298" /><br />
Eğer smslerinizi silmek istemiyorsanız ve gelen kutusu yüzlerce sms ile dolduysa ve telefonunuzun sms yedekleme özelliği yoksa Python sizin yardımınıza hemen yetişir (Tabi işletim sisteminiz Symbian olması lazım!).</p>
<p>Hemen inbox kütüphanesini kullanarak 1 KB&#8217;den daha az bir betik yazarak tüm smslerinizi text dosyası olarak yedekleyip gönül rahatlığıyla silebilirsiniz. Hemen kodlara geçelim:</p>
<pre name="code" class="python">
from time import  ctime
from inbox import Inbox
from os import listdir,mkdir

kutum = Inbox()
id = kutum.sms_messages()
yol = "e:\\mesajlar\\"
if not 'mesajlar' in listdir('e:\\'):
    mkdir(yol)
sayi = 10 #yedeklenmesini istediğiniz sms adedi
for i in range(0,sayi):
    msj = kutum.address(id[i])+'\n'+ctime(kutum.time(id[0]))+'\n'+kutum.content(id[i])
    h,ay,gun,saat,yil = ctime(kutum.time(id[i])).split(" ")
    sa,dk,sn=saat.split(':')
    d = gun+ay+yil+'-'+sa+'.'+dk+'.'+sn+'-'+kutum.address(id[i])+".txt"
    dosya = open(yol+d,'w')
    dosya.write(msj.encode('utf-8'))
    dosya.close()
print str(sayi)+" adet mesaj '"+yol+"' dizinine kaydedildi."
</pre>
<p><span id="more-297"></span><br />
Kodları kısaca açıklayalım.</p>
<p>Önce <span style="color: #0000ff;">inbox </span>modülünü import ediyoruz. Ardından gelen kutusuna bağlanıyoruz. Her smsnin kendine özgü başka smsde ıolmayan bir id numarası vardır. <span style="color: #0000ff;">&#8220;id&#8221; </span>isimli değişkene bu id numaralarını atıyoruz (<span style="color: #0000ff;">kutum.sms_messages()</span>) Sms okumayı bu id numaralarına göre yapacağız. Hafıza kartında mesajlar isminde bir dizin yoksa oluşturuyoruz. Sonra kaç adet sms yedeklemek istiyorsak <span style="color: #0000ff;">&#8220;</span><span style="color: #0000ff;">sayi&#8221; </span>değişkenine o sayıyı yazıyoruz. <span style="color: #0000ff;">&#8220;msj&#8221;</span> isimli değişkene mesajın gönderenini, gönderme zamanını ve mesaj içeriğini atıyoruz. Mesajın gönderme tarihinin formatını ayarlıyoruz ve <span style="color: #0000ff;">gönderme zamanı+gönderen+&#8217;.txt&#8217; </span>isimli bir dosya oluşturup mesajlar dizinine yazdırıyoruz. Yazarken <span style="color: #0000ff;">utf-8 </span>şeklinde kodlanmış olarak yazarsak karakter problemi yaşamayız. Kolay gelsin&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://ftoptas.com/pys60-ile-sms-yedekleme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PyS60 ile Telefon Rehberi Yedekleme</title>
		<link>http://ftoptas.com/pys60-ile-telefon-rehberi-yedekleme/</link>
		<comments>http://ftoptas.com/pys60-ile-telefon-rehberi-yedekleme/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 14:27:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[pys60]]></category>
		<category><![CDATA[contacts]]></category>
		<category><![CDATA[pys60 dersleri]]></category>
		<category><![CDATA[rehber yedekleme]]></category>

		<guid isPermaLink="false">http://ftoptas.com/?p=290</guid>
		<description><![CDATA[Bugün karşılaştığım bir olaydan sonra]]></description>
			<content:encoded><![CDATA[<p>Bugün karşılaştığım bir olaydan sonra Python&#8217;u daha çok sevmeye başladım. Nokia 6600 rehberini yedeklemeye çalıştık birkaç rehber programı kullandık vCard formatında çıkardı ama isimlerin yaklaşık olarak yarısı görünmedi yani tam olarak alamadık. Derken iş başa düştü ve PyS60 ile birkaç satırda hallettik ve bunu sizinle burada paylaşıyorum.</p>
<pre name="code" class="python">import contacts
rehber=contacts.open()
liste=''
s=len(rehber)
for id in rehber:
    try:
        isim=rehber[id][0].value
    except:
        isim='isim yok'
    try:
        no=rehber[id][1].value
    except:
        no='numara yok'
    liste = liste+isim+'-'+no+'\n'
dosya_adi = 'e:\\rehber-yedek.txt'
dosya = open(dosya_adi,'w')
dosya.write(liste.encode('utf-8'))
dosya.close()
print s,' kisi "'+dosya_adi+'" adresine yedeklendi.'</pre>
<p><span id="more-290"></span><br />
utf-8 karakter kodlamasıyla okuyup yazdığımız için herhangi bir karakter problemi de oluşmuyor.</p>
<p>Burada önce contacts modülünü import ediyoruz.</p>
<p><span style="color: #000080;">contacts.open()</span> fonksiyonuyla rehberi açıyoruz.</p>
<p><span style="color: #000080;">len(rehber)</span> rehberdeki kişi sayısını veriyor.</p>
<p>for döngüsüyle rehberdeki her elemanı sırasıyla çekiyoruz.</p>
<p><span style="color: #000080;">rehber[id][0].value</span> değeri bize rehberdeki ismi verir</p>
<p><span style="color: #000080;">rehber[id][1].value</span> değeri bize ilk numarayı veriri</p>
<p><span style="color: #000080;">rehber[id][2].value</span> değeri bize ikinci numarayı verir. Değiştirdiğimiz sayı her bir alanı ifade etmektedir.</p>
<p><span style="color: #000080;">try</span> kullanmamızın nedeni ise bazen isim olup numara olmuyor veya tam tersi oluyor böyle bir durumda hata verip döngüyü bitirmemesidir.</p>
<p>Okuduğumuz isim ve numaraları aralarına bir <span style="color: #008000;">‘-‘</span> karakteri koyarak ve <span style="color: #008000;">‘\n’</span> ile bir alt satıra geçmesini sağlayarak liste stringine ekliyoruz.</p>
<p>for döngüsü bittikten sonra bir dosya açıp <span style="color: #008000;">‘utf-8’</span> karakter kodlamasıyla kaydediyoruz.</p>
<p>Hepsi bu kadar…</p>
]]></content:encoded>
			<wfw:commentRss>http://ftoptas.com/pys60-ile-telefon-rehberi-yedekleme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python ile Resim Üzerine Yazı Yazma</title>
		<link>http://ftoptas.com/python-ile-resim-uzerine-yazi-yazma/</link>
		<comments>http://ftoptas.com/python-ile-resim-uzerine-yazi-yazma/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 10:01:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[imagedraw]]></category>
		<category><![CDATA[imagedraw.text]]></category>
		<category><![CDATA[pil]]></category>
		<category><![CDATA[resim üzerine yazı]]></category>
		<category><![CDATA[text]]></category>

		<guid isPermaLink="false">http://ftoptas.com/?p=279</guid>
		<description><![CDATA[Python ile grafik işleme yapabilmek]]></description>
			<content:encoded><![CDATA[<p>Python ile grafik işleme yapabilmek için <a href="http://www.pythonware.com/products/pil/" target="_blank">PIL (Python Imaging Library) </a>kütüphanesini kullanıyoruz. Kütüphanenin işletim sistemi ve Python sürümümüze uygun olan versiyonunu indirip kuralım. Kütüphanenin doğru bir şekilde kurulup kurulmadığını test etmek için Python komut satırına şunu yazalım:</p>
<pre name="code" class="python">
import PIL
</pre>
<p>Herhangi bir hata vermediyse kütüphane yüklenmiştir. Şimdi işlem yapmaya başlayabiliriz.</p>
<pre name="code" class="python">
from PIL import Image
resim = Image.open("test.jpg")
print resim.size
</pre>
<p>(241,172)<br />
<span id="more-279"></span><br />
<img class="alignnone" title="test" src="http://ftoptas.com/wp-content/uploads/2009/08/pil/test.jpg" alt="" width="241" height="172" /></p>
<p>Burada önce PIL içerisinden Image nesnesini çağırdık ve open fonksiyonuyla test.jpg resmini açtık. Resmin boyutlarını öğrenmek için size özelliğine bakarız. Image nesnesiyle kullanacağımız diğer metotlar için şunu yazabiliriz:</p>
<pre name="code" class="python">
dir(resim)
</pre>
<p>Resim üzerine bir yazı yazmak için de ImageDraw nesnesini kullanacağız. Bu yazının fontunu belirlemek için ImageFont nesnesini kullanacağız.</p>
<pre name="code" class="python">
from PIL import Image,ImageFont,ImageDraw
resim = Image.open("test.jpg")
f = ImageFont.truetype("arial.ttf", 35)
ciz = ImageDraw.Draw(resim)
ciz.text((10,10), "ftoptas.com", font=f, fill="#0C3446")
resim.save("test2.jpg")
</pre>
<p><img class="alignnone" title="test" src="http://ftoptas.com/wp-content/uploads/2009/08/pil/test2.jpg" alt="" width="241" height="172" /></p>
<p>Önce yazacağımız yazının fontunu arial ve font büyüklüğünü de 20 olarak belirledik. Ardından 4. satırda açtığımız resmi kullanarak bir Draw nesnesi oluşturduk. Bu nesnenin text metodunu kullanarak (10,10) koordinatına &#8220;#0C3446&#8243; renginde ve ayarladığımız fontta yazı yazmış olduk. text metodunun parametreleri şu şekildedir:</p>
<p>text((x,y), &#8220;yazılacak metin&#8221;, font, renk)</p>
<p>Son olarak  yeni resmi test2.jpg olarak kaydediyoruz.</p>
<p>Yazıya biraz gölge efekti vermek için yazıyı iki defa farklı renkte ve x-y koordinatlarının 2 piksel arttırılmış olarak kaydedelim.</p>
<pre name="code" class="python">
from PIL import Image,ImageFont,ImageDraw
resim = Image.open("test.jpg")
f = ImageFont.truetype("arial.ttf", 35)
ciz = ImageDraw.Draw(resim)
ciz.text((8,8), "ftoptas.com", font=f, fill="#3EA3D1")
ciz.text((10,10), "ftoptas.com", font=f, fill="#0C3446")
resim.save("test3.jpg")
</pre>
<p><img class="alignnone" title="test" src="http://ftoptas.com/wp-content/uploads/2009/08/pil/test3.jpg" alt="" width="241" height="172" /></p>
<p>Yazının arkasına açık renkli bir diktörtgen çizip yazının okunabilirliğini arttırabiliriz.</p>
<pre name="code" class="python">
from PIL import Image,ImageFont,ImageDraw
resim = Image.open("test.jpg")
f = ImageFont.truetype("arial.ttf", 35)
ciz = ImageDraw.Draw(resim)
ciz.rectangle(((8,8),(190,48)),fill="#ffffff")
ciz.text((8,8), "ftoptas.com", font=f, fill="#3EA3D1")
ciz.text((10,10), "ftoptas.com", font=f, fill="#0C3446")
resim.save("test4.jpg")
</pre>
<p><img class="alignnone" title="test" src="http://ftoptas.com/wp-content/uploads/2009/08/pil/test4.jpg" alt="" width="241" height="172" /></p>
<p>Draw nesnesinin rectangle metodunu kullanarak belirtiğimiz koordinatlara bir diktörtgen oluşturduk. Yazıya bir açı vermek için şu yöntemi kullanabiliriz:</p>
<pre name="code" class="python">
from PIL import Image,ImageFont,ImageDraw
resim = Image.open("test.jpg")
f = ImageFont.truetype("arial.ttf", 20)
yazi = Image.new('RGB',(120,50))
ciz = ImageDraw.Draw(yazi)
ciz.text((8,8), "ftoptas.com", font=f, fill="#ffffff")
yazi = yazi.rotate(15)
resim.paste(yazi,(20,20))
resim.save("test5.jpg")
</pre>
<p><img class="alignnone" title="test" src="http://ftoptas.com/wp-content/uploads/2009/08/pil/test5.jpg" alt="" width="241" height="172" /></p>
<p>RGB formatında 120&#215;50 piksel boyutunda yeni bir Image oluşturup yazıyı onun içine yazdık. Ardından içinde yazı olan resme 15 derece açı verip eski resmin üzerinde yapıştırdık.</p>
]]></content:encoded>
			<wfw:commentRss>http://ftoptas.com/python-ile-resim-uzerine-yazi-yazma/feed/</wfw:commentRss>
		<slash:comments>0</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[pardus]]></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>Python ile HTTP POST/GET Metodu Kullanma</title>
		<link>http://ftoptas.com/python-ile-http-postget-metodu-kullanma/</link>
		<comments>http://ftoptas.com/python-ile-http-postget-metodu-kullanma/#comments</comments>
		<pubDate>Thu, 18 Jun 2009 08:15:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[get]]></category>
		<category><![CDATA[httplib]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[post metodu]]></category>
		<category><![CDATA[python dersleri]]></category>
		<category><![CDATA[urllib]]></category>

		<guid isPermaLink="false">http://ftoptas.com/?p=239</guid>
		<description><![CDATA[Elimizde bazı veriler var ve]]></description>
			<content:encoded><![CDATA[<p>Elimizde bazı veriler var ve bunları POST veya GET metoduyla biyerlere göndermemiz lazım. Yanımızda Python betiklerini çalıştırabilicek bir cihaz (misal: herhangi bir bilgisayar -işletim sistemi farketmez- veya s60 telefon) varsa sorun yok. Hemen kodları yazmaya başlayabilirsiniz. İlk örneğimizde sadece string verileri göndereceğiz. Mesela herhangi bir siteye form bilgilerini giriyoruz.</p>
<pre class="python">import urllib, httplib

veriler = urllib.urlencode({'veri':'herhangi bir veri'})
headers = {"Content-type":"application/x-www-form-urlencoded","Accept":"text/plain"}
baglanti = httplib.HttpConnection("ftoptas.com")
baglanti.request("POST","/ornekform/gonder/",veriler,headers)
cevap = baglanti.getresponse()
baglanti.close()</pre>
<p><span id="more-239"></span></p>
<p>Önce kullanacağımız kütüphaneleri çağırıyoruz. Biz burada urllib ve httplib kütüphanelerini kullandık. Ardından göndereceğimiz verileri belirledik.    Gördüğünüz gibi verileri dictionary şeklinde yazıyoruz. İlk değer verinin ismi ikincisi de değeri oluyor. headers parametresiyle de bu bağlantının nereden geldiğini belirtiyoruz. Sunucu bağlantının nereden geldiğini header bilgilerinden anlar. Dolayısıyla buraya yazacağımız değerlerle bağlantının bir web tarayıcısından geliyormuş gibi görünmesini sağlayabiliriz. Bunun nedeni ise google gibi bazı siteler  header bilgilerine göre cevap vermektedir. Bir nevi sunucuyu kandırmış gibi oluyoruz. <span style="color: #0000ff;">baglanti</span> isminde bir bağlantı yapıyoruz ve yaptığımız bağlantıyla <span style="color: #0000ff;">POST</span> metodunu kullanarak <span style="color: #0000ff;">ftoptas.com/ornekform/gonder/</span> adresine bilgileri gönderiyoruz. Eğer bu göndermenin ardında bir cevap dönüyorsa bunu da <span style="color: #0000ff;">getresponse()</span> fonksiyonuyla alıyoruz.  Bu şekilde gönderdiğimiz bilgileri okumak için sunucumuzu da PHP ile şu şekilde kodlarız:</p>
<pre class="php">$dosyaadi = "deneme.txt"
// verileri yazacağımız dosyayı açıyoruz
$dosya = fopen($dosyaadi,'a+')
// POST metoduyla gelen verileri okuyoruz
$veri = $_POST['veri']
// okuduğumuz verileri dosyaya yazdırıyoruz
fwrite($dosya, $veri, strlen($veri))
// dosyayı kapatıyoruz
fclose($dosya)
// cevap olarak istemciye dönecek veri
echo "veri başarıyla iletildi."</pre>
<p>Eğer string değil de bir dosya göndermek istiyorsak bunu da şöyle yapabiliriz:</p>
<pre class="python">dosya = open(dosyaadi,'r')
veri = dosya.read()
dosya.close()
veri = veri.encode("zlib")
headers = {"Content-type":"application/x-gzip","Accept":"text/plain"}
baglanti = httplib.HttpConnection(sunucu)
baglanti.request("POST",yol,veri,headers)
cevap = baglanti.getresponse()
cevap_dosya = cevap.read()
baglanti.close()</pre>
<p>Burada ise okuduğumuz dosyayi read() yöntemiyle stringe dönüştürüyoruz. Bu stringi de zlib ile kodlayarak sıkıştırılmış bir dosya haline getiriyoruz. Dolayısıyla header bilgilerinde bunun sıkıştırılmış dosya biçimi olduğunu belirtiyoruz. Geri kalan kısmı ilk örnekte yaptığımız gibi oluyor. cevap_dosya ise veri gönderme sonucunda sunucun bize verdiği cevabın stringe dönüşmüş halidir. Bu yöntemle gönderilmiş verileri PHP sunucumuzda okumak için aşağıdaki gibi kodlayalım.</p>
<pre class="php">// gelen veriyi okuyoruz
$veri = file_get_contents('php://input')
// sıkıştırılmış olarak geldiği için gelen veriyi
// tekrar eski haline getirmek için uncompress yapıyoruz
$dosya = gzuncompress($veri)
// eğer veri yoksa -1 değer döndürüyoruz
if (!$dosya){
echo -1
die()
}
// veriyi kaydedeceğimiz dosyanın ismini belirtiyoruz.
// dosya ismi unique yani seçiliyor yani aynı isimde 2 farklı dosya
// bu kısma herhangi bir dosya ismi de verebilirsiniz.
$uid = uniqid()
$dosyaadi = "$uid.tmp"
// dosyayı oluşturuyoruz
$yaz = fopen($dosyaadi,'wb')
// verileri dosyaya yazıyoruz
fputs($yaz,$dosya,strlen($dosya))
// dosyayı kapatıp cevap dönüyoruz
fclose($yaz)
echo "dosya iletildi."</pre>
<p>Bu kodların tamamı PyS60&#8242;da da çalışmaktadır. Yani telefondan da bunları yapabiliriz.  Şimdi yaptığımız iki örnekte sunucumuzu PHP ile programladık. Bir sonraki yazımda Python sunucuları kullanacağız. Bunun için de Google App Engine üzerinde Django kurup çalıştıracağız. Yani hem sunucu hem istemci tamamiyle Python ile yazılmış olacak.</p>
]]></content:encoded>
			<wfw:commentRss>http://ftoptas.com/python-ile-http-postget-metodu-kullanma/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python ve UTF-8 Kullanımı</title>
		<link>http://ftoptas.com/python-ve-utf-8-kullanimi/</link>
		<comments>http://ftoptas.com/python-ve-utf-8-kullanimi/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 14:40:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[encode]]></category>
		<category><![CDATA[utf-8]]></category>

		<guid isPermaLink="false">http://ftoptas.com/?p=237</guid>
		<description><![CDATA[Python ile programlama yaparken karakter]]></description>
			<content:encoded><![CDATA[<p>Python ile programlama yaparken karakter sorununa rastladıysanız sorununuzu çözecek olan şey karakter kodlamasını değiştirmektir. Bu hataya genelde Türkçe karakter kullanırken rastlamışızdır. Bunun için şu yöntemleri kullanabilirz:</p>
<p>Python betiğinin en başına şu satırı yazarak betiğin utf-8 olarak kodlanmasını sağlarız:</p>
<pre class="python"># -*- coding: utf-8 -*-</pre>
<p><span id="more-237"></span></p>
<p>Dosyadan veri okuyacağımız zaman open yerine şunu kullanırız:</p>
<pre class="python">import codecs
codecs.open('dosya.txt','r','utf-8')</pre>
<p>Ya da herhangi bir stringi utf-8 şeklinde kodlamak için şunu kullanırız:</p>
<pre class="python">s = 'normal string'
u = unicode(s,'utf-8')</pre>
<p>Unicode şeklinde kodladığımız u değişkenini tekrar normal string haline getirmek için şunu kullanırız:</p>
<pre class="python">normal = u.encode()</pre>
]]></content:encoded>
			<wfw:commentRss>http://ftoptas.com/python-ve-utf-8-kullanimi/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>4</slash:comments>
		</item>
	</channel>
</rss>
