Karrigell Web开发入门第二季 Part2

这个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的安装包不需要任何配置,并且为开发者仅提供一小组的附加内置函数和变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值