karrigell中forum实例的index.pih学习笔记
我也凑下热闹,不过没什么web开发基础,所以就从大家都推荐的karrigell学起.把昨天学习的一点记录贴上来,分享下,也希望指出我理解有误地方,.昨天晚上学习karrigell论坛的demo(其实我感觉更像个留言薄程序,咔咔)于是就先看了看index.pih,从扩展名看是,是Python嵌入到了html中.打开后,看到:
import forumDb
import time
import ConfigParser
from HTMLTags import *
db = forumDb.db
...
于是顺着这个路线,看一看forumDb的源码:
import os
import kirbybase
db = kirbybase.KirbyBase()
...
果然,db = forumDb.db就是创建的一个KirbyBase实例.哦?仅仅知道KirbyBase是一个python实现的数据库,去官网查了查文档,《kirbybase_python_manual》呼呼,不过KirbyBase的网站似乎也被封了,半天打不开,最后还是用tor打开了.import os在index.pih中用于测试是否已经存在一个table.
if not os.path.exists('forum.tbl'):
db.create('forum.tbl',['parent:int','thread:int','author:str',
'title:str','content:str','date:datetime.datetime',
'lastDate:datetime.datetime','numChildren:int'])
threads = []
else:
threads=db.select('forum.tbl',['parent'],['==-1'],sortFields=['lastDate'],
sortDesc = ['lastDate'], returnType='object')
db.create用来创建一个先的表,接收2个参数,第一个是表名,'forum.tbl'表示创建这个表在当前目录下,后面一个参数是一个列表,是表的字段名和类型.(KirbyBase支持的数据类型有:string, integer, float, boolean, date, and datetime.字段名和类型用':'冒号隔开).如果if后面的成立,也就是说目前并不存在一个'forum.tbl'的表,那么就创建它.他包括了字符类型的'parent',整型的'thread'等等.然后初始话threads为一个空列表.如果已经存在了个'forum.tbl',那就对它进行select操作,select方法返回的是一个列表.在'forum.tbl'中查找'parent'字段中值为-1的记录(KirbyBase除了布尔类型和字符串型外,其他的类型都支持比较运算符,如'>','==','!=','<=',字符类型可以用正则表达式,但必须使用useRegExp=True,《kirbybase_python_manual》有详细介绍).值为-1表示是发表的话题,而不是别人的回帖.sortFields=['lastDate']表示以'lastDate'字段来进行排序操作,sortDesc = ['lastDate']表示按'lastDate'字段的降序进行排列(如果不指定话,则按升序排列,即'lastDate'字段最小的在前).用 returnType='object'表示以'object'类型返回(尽管默认的select返回的是一个列表,但是列表中的记录数据类型可以自定为dict(字典),object等等).
conf=ConfigParser.ConfigParser()
conf.read("forum.ini" )
读取forum.ini中的信息,其中记录着诸如title,table等等样式设置的信息.
print A(IMG('',src="../../doc/images/karrigell_skeudenn.png", border="0", width="100" ),
href="../../" )
print H3(_("Karrigell forum demo")
print A(_("Start new thread ", href='writeMessage.pih?state=new' )
使用了HTMLTags模块的html标记的功能.加入一张带有连接的图片,输出一排'Karrigell forum demo'.然后增加一个超链接到'writeMessage.pih',调用写信息的页面.
def display(i):
time_format = forumDb.get_time_format(ACCEPTED_LANGUAGES)
msg=threads
if i % 2:
print '<tr class="even">'
else:
print '<tr class="odd">'
print '<td><a href="showThread.pih?thread=%s">%s</a> (%s answers)</td>' \
%(msg.recno,msg.title,msg.numChildren)
print '<td>%s</td>' %msg.author
print '<td>%s</td>' %msg.lastDate.strftime(time_format)
print '</tr>'
time_format = forumDb.get_time_format(ACCEPTED_LANGUAGES),调用forumDb模块中的get_time_format()方法,该方法是用来返回格式化的表示时间的字符串:
def get_time_format(languages):
"""Return the formatting string for time, according to language preference"""
if languages and languages[0].lower().startswith('fr'):
return '%d/%m/%Y %H:%M'
else:
return '%Y-%m-%d %H:%M'
(呼呼,为什么考虑到了'fr',嘿嘿,因为karrigell的作者是法国法国布里多尼人(Breton),Karrgell就来自于Breton的一个词).帖子的信息msg=threads,就是从从'forum.tbl'取出的parent字段中值为-1的所有东东.
if i % 2:
print '<tr class="even">'
else:
print '<tr class="odd">'
判断奇偶,隔开相邻话题表格中的背景颜色.
print '<td><a href="showThread.pih?thread=%s">%s</a> (%s answers)</td>' \
%(msg.recno,msg.title,msg.numChildren)
输出title信息,以及每个话题的回复数量,并且在每个title处带有超链接到'showThread.pih'页面,thread=%s和msg.recno对应(msg.recno表示在'forum.tbl'中的索引,它是自动由KirbyBase创建的)%s与msg.title对应,在表格中显示出帖子的标题.然后是回复者的数量,msg.numChildren.
print '<td>%s</td>' %msg.author
print '<td>%s</td>' %msg.lastDate.strftime(time_format)
在表格中输出发贴者和最后回帖时间.
for i in range(len(threads)):
display(i)
遍历整个threads中的记录,输出结果.
呼呼,OK了,有可能的话,继续把后面的也贴上来.