Bottle + SQLAlchemy + Beaker 的節錄


這裡是 pysimple-todo 裡的主代碼.
主要記錄一下如何使用 SQLAlchemy 的存取和整合 Beaker 到 Bottle 當中
同時也因為近日比較多 Simple Todo 的 Porting 所以就基於這東西實作了

詳細代碼可以到我的 GitHub 中取得

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
138
139
140
141
142
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os, sys, model, message
from bottle import debug, route, run, template, static_file, request, redirect, default_app
from sqlalchemy.orm import relation, sessionmaker

# Load session middleware
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'library'))
from beaker.middleware import SessionMiddleware

# Const variable
TITLE = "Simple Todo"
WWW_ROOT = os.path.abspath(os.path.dirname(__file__))

# ORM session
session_marker = sessionmaker(bind=model.engine)
orm_session = session_marker()

# Index
@route('/')
def index():
todos = orm_session.query(model.Todo).order_by('-id')

return template("index", title=TITLE, todos=todos, flush_message=message.flush_message())

# Create
@route('/new', method='POST')
def new():
name = request.forms.get("name").decode("utf-8");

if len(name) > 0:
record = model.Todo(topic=name, status=False)
orm_session.add(record)
orm_session.commit()

message.success(u"新增事項成功")
else:
message.error(u"沒有輸入項目")

redirect("/")

# Delete
@route('/delete/:id')
def delete(id):
todo = orm_session.query(model.Todo).filter_by(id=id).first()

if todo:
orm_session.delete(todo)
orm_session.commit()

message.success(u"刪除事項成功")
else:
message.error(u"找不到記錄")

redirect("/")

# Finish
@route('/finish/:id')
def finish(id):
todo = orm_session.query(model.Todo).filter_by(id=id).first()

if todo:
orm_session.query(model.Todo).filter_by(id=id).update({
model.Todo.status: True
})
orm_session.commit()

message.success(u"完成事項成功")
else:
message.error(u"找不到記錄")

redirect("/")

# Unfinish
@route('/unfinish/:id')
def unfinish(id):
todo = orm_session.query(model.Todo).filter_by(id=id).first()

if todo:
orm_session.query(model.Todo).filter_by(id=id).update({
model.Todo.status: False
})
orm_session.commit()

message.success(u"恢復事項成功")
else:
message.error(u"找不到記錄")

redirect("/")

# Edit
@route('/edit/:id')
def edit(id):
todo = orm_session.query(model.Todo).filter_by(id=id).first()

if todo:
return template("edit", title=TITLE, todo=todo, flush_message=message.flush_message())
else:
message.error(u"找不到記錄")
redirect("/")

@route('/save', method="POST")
def save():
id = request.forms.get("id").decode("utf-8");
name = request.forms.get("name").decode("utf-8");

if id is None or id == "":
message.error(u"找不到記錄")
elif len(name) < = 0:
message.error(u"沒有輸入項目")
else:
todo = orm_session.query(model.Todo).filter_by(id=id).first()

if todo:
orm_session.query(model.Todo).filter_by(id=id).update({
model.Todo.topic: name
})
orm_session.commit()

message.success(u"編輯事項成功")

redirect("/")

# Static file
@route('/static/:path#.+#')
def static_folder(path):
return static_file(path, root=os.path.join(WWW_ROOT, 'static'))

# Boot
if __name__ == "__main__":
debug(True)

app = default_app()
session_options = {
'session.type': 'file',
'session.cookie_expires': 300,
'session.data_dir': './data',
'session.auto': True
}
app = SessionMiddleware(app, session_options)
run(host='localhost', port=8082, reloader=True, app=app)