上接 [Karrigell]Karrigell Web开发入门第二季 Part1
这个CD收藏的程序分为主页和维护数据两部分,上一章节已经讲了主页的设计部分下面就来看看维护数据库部分。
Database engine
Karrigell可以利用适当的模块使用任何数据库引擎(MySQL,SQLite,等)。在这个例子中我们使用非常简单的模块存储数据,我们需要的数据有:收藏的每个CD,艺术家名字和CD封面的标题。
拷贝如下代码到simpledb.py模块中:
def read(filename):
records = []
try:
for line in open(filename):
records.append(line.strip().split("#"))
except IOError:
pass
return records
def save(records,filename):
out = open(filename,'w')
for items in records:
out.write('#'.join(items)+'/n')
out.close()
当我们在一个脚本中import这个模块后,我们就可以简单的使用read()和save()函数了。这些数据存放在一个列表里。
在我们的CD收藏程序中,信息将会包含两个值:艺术家名字和CD标题。如果我们把数据库叫做mycds.db,那么在HTML表格里打印所有CD的程序就是这样的:
import simpledb
cds = simpledb.read('mycds.db')
for (artist,title) in cds:
print artist,title
Home page with the CD list
我们现在修改index()函数来打印所有CD的列表。
import simpledb
def index():
print "<h1>My record collection</h1>"
# login / logout
logged = hasattr(Session(),"user") and Session().user is not None
if logged:
print 'Logged in as %s<br>' %Session().user
print '<a href="logout">Logout</a><p>'
else:
print '<a href="login">Login</a><p>'
# print existing records
cds = simpledb.read('mycds.db')
if cds:
print '<table border="1">'
print '<tr><th>Artist</th><th>Title</th></tr>'
for (artist,title) in cds:
print '<tr><td>%s</td><td>%s</td></tr>' %(artist, title)
print '</table><p>'
else:
print "No CD in the collection<p>"
# prompt logged in users to enter a new record
if logged:
print '<a href="new_cd">Enter new CD</a><p>'
# page counter
Include('../counter.py',counter_file='counter.txt')
注意我们是在模块的最顶端import simpledb的:它的意思是可以在所有的函数里可用,就像纯粹的Python脚本的意义一样。
Adding new CDs
为登录用户提供一个用于在数据库中创建新CD的链接。这个链接的href属性值是new_cd,所以我们必须写个函数new_cd()
这个函数将打印一个表单来输入CD的艺术家和标题,并且可以提交到另一个函数来把数据写到数据库里,然后返回到主页。
这时候我们不应该看不懂如下的代码:
def new_cd():
print '<h1>New CD</h1>'
print '<form action="insert_new_cd" method="post">'
print 'Artist <input name="artist"><br>'
print 'Title <input name="title"><br>'
print '<input type="submit" value="Ok">'
print '</form>'
def insert_new_cd(artist,title):
cds = simpledb.read('mycds.db')
cds.append((artist,title))
simpledb.save(cds,'mycds.db')
raise HTTP_REDIRECTION,"index"
添加上面的函数到index.ks然后输入一组CD的信息到数据库里。每次返回到主页我们都会看到收藏的CD在增加。
Editing records
登录的用户应该能编辑CD的信息,应该在CD列表上显示一个“Edit"链接用来编辑数据。
这就需要CD的信息可以从主页到编辑页面,为此我们在链接上附加CD的信息,如:href = edit?artist=Beatles&title=Revolver;但是数据库一般提供记录标识符,在我们的例子中使用记录号来标识。
在我们的这个简单数据库里我们可以使用列表的索引来标识,因此我们可以通过如下方式打印CD收藏的数据:
# print existing records
import simpledb
cds = simpledb.read('mycds.db')
if cds:
print '<table border="1">'
print '<tr><th>Artist</th><th>Title</th></tr>'
for num,(artist,title) in enumerate(cds):
print '<tr><td>%s</td><td>%s</td>' %(artist, title)
if logged:
print '<td><a href="edit?num=%s">Edit</a></td>' %num
print '</tr>'
print '</table><p>'
else:
print "No CD in the collection<p>"
函数edit()将会接收一个叫num的参数。所有传递到Karrigell Service中的函数都是字符串形式的,因此在把num当作列表索引的时候不要忘记把它转换成整数。
def edit(num):
cds = simpledb.read('mycds.db')
artist,title = cds[int(num)]
print '<h1>New CD</h1>'
print '<form action="update_cd" method="post">'
print '<input name="num" type="hidden" value="%s">' %num
print 'Artist <input name="artist" value="%s"><br>' %artist
print 'Title <input name="title" value="%s"><br>' %title
print '<input type="submit" value="Ok">'
print '</form>'
def update_cd(num,artist,title):
cds = simpledb.read('mycds.db')
cds[int(num)] = (artist,title)
simpledb.save(cds,'mycds.db')
raise HTTP_REDIRECTION,"index"
Removing records
最后一步是可以删除CD数据,修改index()函数:
# print existing records
import simpledb
cds = simpledb.read('mycds.db')
if cds:
print '<table border="1">'
print '<tr><th>Artist</th><th>Title</th>'
if logged:
print '<th> </th>'*2
print '</tr>'
for num,(artist,title) in enumerate(cds):
print '<tr><td>%s</td><td>%s</td>' %(artist, title)
if logged:
print '<td><a href="edit?num=%s">Edit</a></td>' %num
print '<td><a href="remove?num=%s">Remove</a></td>' %num
print '</tr>'
print '</table><p>'
else:
print "No CD in the collection<p>"
然后添加一个新函数,remove():
def remove(num):
cds = simpledb.read('mycds.db')
del cds[int(num)]
simpledb.save(cds,'mycds.db')
raise HTTP_REDIRECTION,"index"
Summary
现在我们有了一个完整的管理我们CD收藏数据的应用程序。index.ks脚本中的结构就像其它任何Python模块一样简洁:
import simpledb
def index():
...
# login / logout
...
# print existing records
...
# prompt logged in users to enter a new record
...
# page counter
...
def login():
...
def check_login(login,passwd):
...
def logout():
...
def new_cd():
...
def insert_new_cd(artist,title):
...
def edit(num):
...
def update_cd(num,artist,title):
...
def remove(num):
...
程序中的每个函数都对应着一个页面。页面接收用户的输入,把输入字段当作参数(通常是以字符串形式)传入函数。
通过这些简短的介绍我们就可以知道我们需要了解一些Python和HTML。Karrigell的安装包不需要任何配置,并且为开发者仅提供一小组的附加内置函数和变量。