More Related Content
Similar to bottleで始めるWEBアプリの最初の一歩 (20)
More from Satoshi Yamada (13)
bottleで始めるWEBアプリの最初の一歩
- 2. 2
# whoami
•名前
• 山田 聡(@denzowill)
•仕事
• DBエンジニア(○racle,PostgreSQL)
• チョットだけWebLogicエンジニア
• Pythonは趣味
•スキル
• 統計もわかりません
• 機械学習もわかりません
• ちょっとWEBアプリわかります
- 11. 11
WEBアプリに必要なもの
ビジネスロジック → あなたがやりたいこと
普通の処理
def view_list():
connect = db.connect()
cur = connect.cursor()
cur.execute("select id,name from items order by id")
item_list = []
for row in cur.fetchall():
item_list.append({
"id":row[0], "item_name": row[1]
})
return item_list
DBから商品一覧を
取得したい etc
- 32. 32
Bottleの動作確認
from bottle import route, run
# / にアクセスしたら index関数が呼ばれる
@route("/")
def index():
# 画面に表示されて欲しいHTMLを戻す
return "<h1>WELCOME STAPY!</h1>"
# サーバを起動(localhost:9999で起動する設定)
run(reloader=True, port=9999)
app.py
- 34. 34
アイテム一覧見たい
# アイテム一覧を戻す関数
@route("/list")
def view_list():
# ダミーデータ(あとでDBから取得するようにする)
item_list = [
{"id": 1, "name": "りんご"},
{"id": 2, "name": "ばなな"},
{"id": 3, "name": "すいか"},
]
# 表示用のHTMLを組み立てる
display_html = "<table border='1'>"
for item in item_list:
display_html += "<tr>"
display_html += "<td>{}</td>".format(item["id"])
display_html += "<td>{}</td>".format(item["name"])
display_html += "</tr>"
display_html += "</table>"
return display_html
app.py
- 38. 38
テンプレート使う
from bottle import route, run, template
:
:
# アイテム一覧を戻す関数
@route("/list")
def view_list():
# ダミーデータ(あとでDBから取得するようにする)
item_list = [
{"id": 1, "name": "りんご"},
{"id": 2, "name": "ばなな"},
{"id": 3, "name": "すいか"},
]
# 表示はテンプレートを戻すだけ
return template("list_tmpl", item_list=item_list)
app.py
- 41. 41
初期データの準備
import sqlite3
# items.dbとつなぐ(なければ作られる)
conn = sqlite3.connect('items.db')
c = conn.cursor()
# テーブル作成
c.execute("create table items(id, name)")
# 3行投入
c.execute("insert into items values(1,'りんご')")
c.execute("insert into items values(2,'ばなな')")
c.execute("insert into items values(3,'すいか')")
# 確定
conn.commit()
# バイバイ
conn.close()
pythonを対話型で起動して実行
- 42. 42
DBからitem_listを取得するように変更
import sqlite3
from bottle import route, run, template
:
:
@route("/list")
def view_list():
# items.dbとつなぐ
conn = sqlite3.connect('items.db')
c = conn.cursor()
c.execute("select id,name from items order by id")
item_list = []
for row in c.fetchall():
item_list.append({
"id": row[0],
"name": row[1]
})
conn.close()
# 表示はテンプレートを戻すだけ
return template("list_tmpl", item_list=item_list)
app.py
- 47. 47
ルーティングとメソッド作成
@route("/add", method=["GET","POST"])
def add_item():
if request.method == "POST":
# POSTアクセスならDBに登録する
# フォームから入力されたアイテム名の取得(Python2ならrequest.POST.getunicodeを使う)
item_name = request.POST.getunicode("item_name")
conn = sqlite3.connect('items.db')
c = conn.cursor()
# 現在の最大ID取得(fetchoneの戻り値はタプル)
new_id = c.execute("select max(id) + 1 from items").fetchone()[0]
c.execute("insert into items values(?,?)", (new_id, item_name))
conn.commit()
conn.close()
return "SUCCESS"
else:
# GETアクセスならフォーム表示
return template("add_tmpl")
app.py
POST/GETで分岐
GETはフォーム出すだけ
formからPOSTされた
データを取得
- 51. 51
削除処理を追加、URLから削除対象のID取得
# /del/100 -> item_id = 100
# /del/one -> HTTPError 404
@route("/del/<item_id:int>")
def del_item(item_id):
conn = sqlite3.connect('items.db')
c = conn.cursor()
# 指定されたitem_idを元にDBデータを削除
c.execute("delete from items where id=?", (item_id,))
conn.commit()
conn.close()
# 処理終了後に一覧画面に戻す
return redirect("/list")
app.py
delの後ろに数字がくると
関数の引数として取れる
後はそれで
delete文するだけ