web.py实例之简易博客

这个例子是从网上抄来的,原文中数据库应该是用的mysql,我只是学习,就改成了sqlite。废话不说了,直接上代码吧。

创建目录

1
2
mkdir -p blog/templates
cd blog

后面的工作都是在blog目录下进行的,后面所有的文件也都在该目录下。

建表

1
2
3
4
5
6
create table article(
id integer primary key autoincrement,
title varchar(200),
content text,
pub_time timestamp default(datetime('now','localtime'))
);

model.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import web
import datetime
db = web.database(dbn='sqlite', db='test.db')
def get_posts():
return db.select('entries', order='id desc')
def get_post(id):
return db.select('entries', where='id=$id', vars=locals())[0]
def new_post(title, text):
db.insert('entries', title=title, content=text,
pub_time=datetime.datetime.now())
def del_post(id):
db.delete('entries', where='id=$id', vars=locals())
def update_post(id, title, text):
db.update('entries', where='id=$id', vars=locals(),
title=title, content=text)

blog.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
import web
import model
urls = (
'/', 'Index',
'/view/(\d+)', 'View',
'/new', 'New',
'/delete/(\d+)', 'Delete',
'/edit/(\d+)', 'Edit',
'/login', 'Login',
'/logout', 'Logout',
)
app = web.application(urls, globals())
t_globals = {
'datestr': web.datestr,
'cookie': web.cookies,
}
render = web.template.render('templates', base='base', globals=t_globals)
login = web.form.Form(
web.form.Textbox('username'),
web.form.Password('password'),
web.form.Button('login')
)
class Index:
def GET(self):
login_form = login()
posts = model.get_posts()
return render.index(posts, login_form)
def POST(self):
login_form = login()
if login_form.validates():
if login_form.d.username == 'admin' \
and login_form.d.password == 'admin':
web.setcookie('username', login_form.d.username)
raise web.seeother('/')
class View:
def GET(self, id):
post = model.get_post(int(id))
return render.view(post)
class New:
form = web.form.Form(
web.form.Textbox('title',
web.form.notnull,
size=30,
description='post title: '),
web.form.Textarea('content',
web.form.notnull,
rows=30,cols=80,
description='post content: '),
web.form.Button('post entry')
)
def GET(self):
form = self.form()
return render.new(form)
def POST(self):
form = self.form()
if not form.validates():
return render.new(form)
model.new_post(form.d.title, form.d.content)
raise web.seeother('/')
class Delete:
def GET(self, id):
model.del_post(int(id))
raise web.seeother('/')
def POST(self, id):
model.del_post(int(id))
raise web.seeother('/')
class Edit:
def GET(self, id):
post = model.get_post(int(id))
form = New.form()
form.fill(post)
return render.edit(post, form)
def POST(self, id):
form = New.form()
post = model.get_post(int(id))
if not form.validates():
return render.edit(post, form)
model.update_post(int(id), form.d.title, form.d.content)
raise web.seeother('/')
class Logout:
def GET(self):
web.setcookie('username', '', expires=-1)
raise web.seeother('/')
def notfound():
return web.notfound('sorry, the page you were looking for was not found.')
app.notfound = notfound
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
19
20
$def with (page)
<html>
<head>
<title>My Blog</title>
<style>
#menu {
width: 200px;
float: right;
}
</style>
</head>
<body>
<ul id="menu">
<li><a href="/">Home</a></li>
$if cookie().get('username'):
<li><a href="/new">New Post</a></li>
</ul>
$:page
</body>
</html>

templates/edit.html

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

templates/index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$def with (posts, login_form)
<h1>Blog posts</h1>
$if not cookie().get('username'):
<form action="" method="post">
$:login_form.render()
</form>
$else:
Welcome $cookie().get('username')!<a href="/logout">Logout</a>
<ul>
$for post in posts:
<li>
<a href="/view/$post.id">$post.title</a>
on $post.pub_time
$if cookie().get('username'):
<a href="/edit/$post.id">Edit</a>
<a href="/delete/$post.id">Del</a>
</li>
</ul>

templates/new.html

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

templates/view.html

1
2
3
4
$def with (post)
<h1>$post.title</h1>
$post.pub_time<br>
$post.content

以上例子是经过验证了的,如果不行自己找原因。