Bottle Örnek Yapılacaklar Listesi
Önceki yazımda Python Bottle Mikro Ağ-Çerçevesi konusunu kısaca ele almıştım.
Bu yazımda ise https://bottlepy.org sitesindeki örneği, bazı mesajlarını Türkçeleştirerek aktaracağım.
İlk çalışmamda edit, save, new gibi terimleri de Türkçeleştirmiştim. Ama sonra Python programcılarının ister istemez teknik İngilizce terimleri bilmeleri gerektiğini düşünerek sadece bazı mesajları Türkçeleştirmekle yetindim.
Orijinal kod listesinde eksik bırakılan help.html dosyasını ekledim ve içine kısaca bottle projesi çalışırken kullanılacak terimlerin işlevini basit bir tablo olarak ilave ettim.
Örijinal kodlarda static_file(‘help.html’, root=’.’) satırında bulunması gereken return anahtar sözcüğü unutulmuştu. Onu da ekledim.
Uygulama, basit “Yapılacaklar Listesi” için gereken işlevlere sahip. Veritabanı olarak SQLite3 kullanıyor.
Düzenlemeleri yaparken Pycharm Community Edition sürümünü kullandım. Python sürümü 3.6.3 ve bottle sürümü 0.12.13.
Pycharm ile “bottle” isimli yeni bir proje klasörü tanımladım.
İlk aşamada veritabanını oluşturmalıyız. Sitede verilen kod satırlarını biraz revize edip veritabani.py dosyasına kaydettim. Bu betik veritabanını oluşturmak amacıyla sadece bir kez çalıştırılacak.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# veritabani.py import sqlite3 conn = sqlite3.connect('todo.db') # Warning: This file is created in the current directory conn.execute("CREATE TABLE todo (id INTEGER PRIMARY KEY, task char(100) NOT NULL, status bool NOT NULL)") """ conn.execute("INSERT INTO todo (task,status) VALUES ('Read A-byte-of-python to get a good introduction into Python',0)") conn.execute("INSERT INTO todo (task,status) VALUES ('Visit the Python website',1)") conn.execute("INSERT INTO todo (task,status) VALUES ('Test various editors for and check the syntax highlighting',1)") conn.execute("INSERT INTO todo (task,status) VALUES ('Choose your favorite WSGI-Framework',0)") """ conn.execute("INSERT INTO todo (task,status) VALUES ('Python hakkında güzel bir başlangıç için A-byte-of-python oku',0)") conn.execute("INSERT INTO todo (task,status) VALUES ('Python sitesini ziyaret et',1)") conn.execute("INSERT INTO todo (task,status) VALUES ('Değişik metin düzenleyicileri dene ve vurgulamaları kontrol et',1)") conn.execute("INSERT INTO todo (task,status) VALUES ('Favori WSGI Ağ-çerçevesini seç',0)") conn.commit() |
Sistemde ana kod dosyamız dışında help.html isimli bir yardım dosyamız, 3 tane de şablon (template) dosyamız bulunuyor. (SQLite3 veritabanı dosyası todo.db de aynı klasörde.)
Önce html ve şablon dosyaların içeriğini aktarayım:
help.html dosyası
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<table border="1"> <tr> <td colspan="2"><h1>Bottle Yardım Dosyası</h1></td> </tr> <tr><td>localhost:8080/todo</td><td>Açık Todo kayıtlarını listeler</td></tr> <tr><td>localhost:8080/help </td><td>Bu yardım dosyasını ekrana getirir</td></tr> <tr><td>localhost:8080/new</td><td>Yeni bir kayıt girmeyi sağlar</td></tr> <tr><td>localhost:8080/edit/5</td><td>5 nolu kaydı düzeltme işlemini başlatır</td></tr> <tr><td>localhost:8080/item2</td><td>2 nolu kaydı gösterir</td></tr> <tr><td>localhost:8080/json3</td><td>3 nolu kaydı json formatında gösterir</td></tr> <tr><td>debug(True)</td><td>Hata yakalama modunu etkinleştirir</td></tr> <tr><td>run(reloader=True)</td><td></td></tr> </table> |
make_table.tpl şablon dosyası
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
%#template to generate a HTML table from a list of tuples (or list of lists, or tuple of tuples or ...) %#HTML tablo oluşturmak için bir demet listesinden (veya liste listesinden, demet demetinden veya ...) şablon %#<p>The open items are as follows:</p> <p>Açık kayıtlar aşağıdadır:</p> <table border="1"> %for row in rows: <tr> %for col in row: <td>{{col}}</td> %end </tr> %end </table> |
edit_task.tpl şablon dosyası
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
%#template for editing a task %#the template expects to receive a value for "no" as well a "old", the text of the selected ToDo item %#<p>Edit the task with ID = {{no}}</p> <p>ID = {{no}} nolu kaydı düzelt</p> <form action="/edit/{{no}}" method="get"> <input type="text" name="task" value="{{old[0]}}" size="100" maxlength="100"> <select name="status"> <option>open</option> <option>closed</option> </select> <br> <input type="submit" name="save" value="save"> </form> |
new_task.tpl şablon dosyası
1 2 3 4 5 6 7 8 9 |
%#template for the form for a new task %#<p>Add a new task to the ToDo list:</p> <p>ToDo listesine: yeni bir kayıt ekle</p> <form action="/new" method="GET"> <input type="text" size="100" maxlength="100" name="task"> <input type="submit" name="save" value="save"> </form> |
Son olarak Python kod dosyası todo.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
""" Original code: https://bottlepy.org/docs/dev/tutorial_app.html#complete-example-listing Orijinal kod: https://bottlepy.org/docs/dev/tutorial_app.html#complete-example-listing Örnek, İngilizce bilmeyenlerin de kolay anlayabileceği şekilde yeniden düzenlenmiştir. Düzenleme: 2017.12.10 Düzenleyen: Ahmet Aksoy """ import sqlite3 from bottle import route, run, debug, template, request, static_file, error # only needed when you run Bottle on mod_wsgi # aşağıdaki satır sadece Bottle, mod_wsgi ile çalıştırıldığında gereklidir from bottle import default_app @route('/todo') def todo_list(): conn = sqlite3.connect('todo.db') c = conn.cursor() c.execute("SELECT id, task FROM todo WHERE status LIKE '1'") result = c.fetchall() c.close() output = template('make_table', rows=result) return output @route('/new', method='GET') def new_item(): if request.GET.save: new = request.GET.task.strip() conn = sqlite3.connect('todo.db') c = conn.cursor() c.execute("INSERT INTO todo (task,status) VALUES (?,?)", (new, 1)) new_id = c.lastrowid conn.commit() c.close() return '<p>The new task was inserted into the database, the ID is %s</p>' % new_id else: return template('new_task.tpl') @route('/edit/<no:int>', method='GET') def edit_item(no): if request.GET.save: edit = request.GET.task.strip() status = request.GET.status.strip() if status == 'open': status = 1 else: status = 0 conn = sqlite3.connect('todo.db') c = conn.cursor() c.execute("UPDATE todo SET task = ?, status = ? WHERE id LIKE ?", (edit, status, no)) conn.commit() #return '<p>The item number %s was successfully updated</p>' % no return '<p>%s nolu kayıt başarıyla düzeltilmiştir.</p>' % no else: conn = sqlite3.connect('todo.db') c = conn.cursor() c.execute("SELECT task FROM todo WHERE id LIKE ?", (str(no))) cur_data = c.fetchone() return template('edit_task', old=cur_data, no=no) @route('/item<item:re:[0-9]+>') def show_item(item): conn = sqlite3.connect('todo.db') c = conn.cursor() c.execute("SELECT task FROM todo WHERE id LIKE ?", (item,)) result = c.fetchall() c.close() if not result: #return 'This item number does not exist!' return 'Bu kayıt numarası yoktur!' else: return 'Task: %s' % result[0] @route('/help') def help(): return static_file('help.html', root='.') @route('/json<json:re:[0-9]+>') def show_json(json): conn = sqlite3.connect('todo.db') c = conn.cursor() c.execute("SELECT task FROM todo WHERE id LIKE ?", (json,)) result = c.fetchall() c.close() if not result: #return {'task': 'This item number does not exist!'} return {'task': 'Bu kayıt numarası yoktur!'} else: return {'task': result[0]} @error(403) def mistake403(code): #return 'There is a mistake in your url!' return 'url bilgisi hatalıdır!' @error(404) def mistake404(code): #return 'Sorry, this page does not exist!' return 'Ne yazık ki bu sayfa mevcut değildir!' debug(True) run(reloader=True) # remember to remove reloader=True and debug(True) when you move your # application from development to a productive environment # # uygulamanızı geliştirmeden üretim ortamına aktardığınızda # reloader = True ve debug(True) ifadelerini kaldırmanız gerektiğini # hatırlayın |
Dosyalarımızın hepsi bottle proje klasörünün içinde yer alıyor.
Kodların, ek açıklamaya gerek duymayacak kadar açık olduğunu düşünüyorum. Arada bir kaç satırlık açıklama da var zaten.
Yine de sormak istedikleriniz olursa, yorum alanını kullanabilirsiniz.
Ahmet Aksoy
Bottle Örnek Yapılacaklar Listesi
Referanslar: