web.py实例之其他

之前抄的blog的例子本以为是个人写的,后来才发现原来就是官网上的例子。那下面就把官网上的其他例子都抄来吧。这是官网地址,把其中使用的数据库我都改成了sqlite,不多说,上代码。

skeleton

111.sql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

CREATE TABLE user(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name CHAR(10),
passwd VARCHAR(100));
-- 创建item表
CREATE TABLE item(
id INTEGER PRIMARY KEY AUTOINCREMENT,
author_id INTEGER,
body TEXT,
created TIMESTAMP DEFAULT (datetime('now','localtime')),
CONSTRAINT fk_user
FOREIGN KEY (author_id)
REFERENCES user(id));
-- 开启外键支持
PRAGMA foreign_keys=ON;

code.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import web
import view, config
from view import render

urls = (
'/', 'index'
)

class :
def GET(self):
return render.base(view.listing())

if __name__ == '__main__':
app = web.application(urls, globals())
app.internalerror = web.debugerror
app.run()

config.py

1
2
3
import web
DB = web.database(dbn='sqlite', db='test.db')
cache = False

db.py

1
2
3
4
import config

def listing(**k):
return config.DB.select('item', **k);

view.py

1
2
3
4
5
6
7
8
9
10
11
12
13
import web
import db
import config

t_globals = dict(
datestr = web.datestr,
)
render = web.template.render('templates/', cache=config.cache, globals=t_globals)
render._keywords['globals']['render'] = render

def listing(**k):
l = db.listing(**k)
return render.listing(l)

templates/base.html

1
2
3
4
5
6
7
8
9
$def with (page, title=None)
<html><head>
<title>my site
$if title: : $title
</title>
</head><body>
<h1><a href="/">my site</a></h1>
$:page
</body></html>

templates/item.html

1
2
3
4
$def with (item)

<p>$item.body</p>
<p class="details">created $datestr(item.created)</p>

templates/listing.html

1
2
3
4
$def with (items)

$for item in items:
$:render.item(item)

todo-list

111.sql

1
2
3
4
-- 创建todo表
CREATE TABLE todo(
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT);

model.py

1
2
3
4
5
6
7
8
9
10
11
12
import web

db = web.database(dbn='sqlite', db='test.db')

def get_todos():
return db.select('todo', order='id')

def new_todo(text):
db.insert('todo', title=text)

def del_todo(id):
db.delete('todo', where='id=$id', vars=locals())

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
import web
import model

urls = (
'/', 'Index',
'/del/(d+)', 'Delete'
)

render = web.template.render('templates', base='base')

class Index:
form = web.form.Form(
web.form.Textbox('title', web.form.notnull,
description='I need to:'),
web.form.Button('Add todo'),
)

def GET(self):
'''Show page'''
todos = model.get_todos()
form = self.form()
return render.index(todos, form)

def POST(self):
'''Add new entry'''
form = self.form()
if not form.validates():
todos = model.get_todos()
return render.index(todos, form)
model.new_todo(form.d.title)
raise web.seeother('/')

class Delete:
def POST(self, id):
'''Delete based on ID'''
id = int(id)
model.del_todo(id)
raise web.seeother('/')

app = web.application(urls, globals())

if __name__ == '__main__':
app.run()

templates/base.html

1
2
3
4
5
6
7
8
9
10
11
12
$def with (page)

<html>
<head>
<title>Todo list</title>
</head>
<body>

$:page

</body>
</html>

templates/index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$def with (todos, form)

<table>
<tr>
<th>What to do?</th>
<th></th>
</tr>
$for todo in todos:
<tr>
<td>$todo.title</td>
<td>
<form action="/del/$todo.id" method="post">
<input type="submit" value="Delete" />
</form>
</td>
</tr>
</table>

<form action="" method="post">
$:form.render()
</form>

wiki

111.sql

1
2
3
4
5
CREATE TABLE pages(
id INTEGER PRIMARY KEY AUTOINCREMENT,
url TEXT,
title TEXT,
content TEXT);

model.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
import web

db = web.database(dbn='sqlite', db='wiki.db')

def get_pages():
return db.select('pages', order='id DESC')

def get_page_by_url(url):
try:
return db.select('pages', where='url=$url', vars=locals())[0]
except IndexError:
return None

def get_page_by_id(id):
try:
return db.select('pages', where='id=$id', vars=locals())[0]
except: IndexError:
return None

def new_page(url, title, text):
db.insert('pages', url=url, title=title, content=text)

def del_page(id):
db.delete('pages', where='id=$id', vars=locals())

def update_page(id, url, title, text):
db.update('pages', where='id=$id', vars=locals(),
url=url, title=title, content=text)

wiki.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
import web
import model
import markdown

urls = (
'/', 'Index',
'/new', 'New',
'/edit/(d+)', 'Edit',
'/delete/(d+)', 'Delete',
'/(.*)', 'Page',
)

t_globals = {
'datestr': web.datestr,
'markdown': markdown.markdown,
}
render = web.template.render('templates', base='base', globals=t_globals)

class Index:
def GET(self):
pages = model.get_pages()
return render.index(pages)

class Page:
def GET(self, url):
page = model.get_page_by_url(url)
if not page:
raise web.seeother('/new?url=%s' % web.websafe(url))
return render.view(page)

class New:
def not_page_exists(url):
return not bool(model.get_page_by_url(url))

page_exists_validator = web.form.Validator('Page already exists', not_page_exists)

form = web.form.Form(
web.form.Textbox('url', web.form.notnull, page_exists_validator,
size=30,
description='Location:'),
web.form.Textbox('title', web.form.notnull,
size=30,
description='Page title:'),
web.form.Textarea('content', web.form.notnull,
rows=30, cols=80,
description='Page content:', post='Use markdown syntax'),
web.form.button('Create page'),
)

def GET(self):
url = web.input(url='').url
form = self.form()
form.fill({'url':url})
return render.new(form)

def POST(self):
form = self.form()
if not form.validates():
return render.new(form)
model.new_page(form.d.url, form.d.title, form.d.content)
raise web.seeother('/' + form.d.url)

class Delete:
def POST(self, id):
model.del_page(int(id))
raise web.seeother('/')

class Edit:
form = web.form.Form(
web.form.Textbox('url', web.form.notnull,
size=30,
description='Location:'),
web.form.Textbox('title', web.form.notnull,
size=30,
description='Page title:'),
web.form.Textarea('content', web.form.notnull,
rows=30, cols=80,
description='Page content:', post='Use markdown syntax'),
web.form.Button('Update page'),
)

def GET(self, id):
page = model.get_page_by_id(int(id))
form = self.form()
form.fill(page)
return render.edit(page, form)

def POST(self, id):
form = self.form()
page = model.get_page_by_id(int(id))
if not form.validates():
return render.edit(page, form)
model.update_page(int(id), form.d.url, form.d.title, form.d.content)
raise web.seeother('/')

app = web.application(urls, globals())

if __name__ == '__main__':
app.run()

templates/base.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$def with (page)
<html>
<head>
$if page.has_key('title'):
<title>$page.title</title>
$else:
<title>My Wiki</title>
<style>
</style>
</head>
<body>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/new">New Page</a></li>
</ul>
$:page
</body>
</html>

templates/edit.html

1
2
3
4
5
6
7
8
9
$def with (page, form)
<h1>Edit $form.d.title</h1>
<form action="" method="post">
$:form.render()
</form>
<h2>Delete page?</h2>
<form action="/delete/$page.id" method="post">
<input type="submit" value="Delete page" />
</form>

templates/index.html

1
2
3
4
5
6
7
$def with (pages)
<h1>Webpy Wiki</h1>
<h2>Pages:</h2>
<ul>
$for page in pages:
<li><a href="/$page.url">$page.url</a></li>
</ul>

templates/new.html

1
2
3
4
5
$def with (form)
<h1>New Wiki Page</h1>
<form action="" method="post">
$:form.render()
</form>

templates/view.html

1
2
3
4
5
$def with (page)
$var title: $page.title
<h1>$page.title</h1>
$:markdown(page.content)
<a href='/edit/$page.id'>Edit</a>