1. 用户友好的URL

现在已经做好的系统让我不爽的一点是URL不够美观."/Foo"不比"/?pagename=Foo"漂亮的多?幸运的是,要做到这一点很简单 我们只需要在Controller.py里面加一个default方法,无论何时在cherrypy没有其他方法对应URL时就会呼叫这个方法(Cherrypy2.1, CherryPy2.2已经作改动)

@turbogears.expose(html="wiki20.templates.page")
def default(self, pagename):
 return self.index(pagename)

现在我们就可以在save方法里改动HTTPRedirect参数为turbogears.url("/%s" % pagename). 怎么处理WiliWords? WiliWords也叫WordsSmashedTogether(挤在一起的几个词).一个典型的wili应该在发现wikiwords时能自动为这些词产生连接. 这个主意听上去不错,怎么处理这个问题?我们自然而然的会想到正则表达式. 我们从import正则表达式开始:

import re

一个wikiword的构成是这个样子的:(以一个大写字母开头,然后是一堆小写字母)*n. 用正则表达式表示wikiword为:

wikiwords = re.compile(r"\b([A-Z]\w+[A-Z]+\w+)")

把这句话放在我们的Root controller类上面.之后我们就需要真正用这个表达式了.在publish_parts下面(index方法)加上:

root = str(turbogears.url("/"))
content = wikiwords.sub(r'<a href="%s\1">\1</a>' % root, content)

现在添加一个wikiwords到我们的页面,然后当你浏览这个页面时,你就会看到一个连接.当然,这时候点击那个连接会显示错误 页面在哪? 现在应该在代码里加上对不存在页面的检查.我在这里的处理很简单:如果一个页面部存在,你就会被连到一个编辑页面上.在index方法中 我们检查是否一个页面存在,如果不存在,我们重定向到一个新的notfound方法,现在我们就来修改index方法:

try:
   page = Page.byPagename(pagename)
except SQLObjectNotFound:
   raise cherrypy.HTTPRedirect(turbogears.url("/notfound", pagename= pagename)) 

我们需要import这个SQLObjectNotFound异常,在文件顶端加上这一句话:

from sqlobject import SQLObjectNotFound 

下面,我们就来添加not found方法,我们直接用edit模板

@turbogears.expose(html="wiki20.templates.edit")
def notfound(self, pagename):
 return dict(pagename=pagename, data="", new=True) 

请注意返回的dictionary中包括一个变量叫"new",在edit方法里我们也在返回的dictionary中加上new=false

return dict(pagename=page.pagename, data=page.data, new=False)

我们需要能够保存一个新的页面,自然,我们要修改save方法:

@turbogears.expose()
def save(self, pagename, data, submit, new):
   hub.begin()
   if new == "True":
   page = Page(pagename=pagename, data=data)
   else:
   page = Page.byPagename(pagename)
   page.data = data
   hub.commit()
   hub.end()
   turbogears.flash("Changes saved!")
   raise cherrypy.HTTPRedirect(turbogears.url("/%s" % pagename)) 

记得我们在命令行中创建了我们的第一个页面,创建一个SQLObject对象会自动在数据库里添加一个新的纪录 我么要做的最后一件事情就是通过edit.kid模板向save方法传递"new"变量

<input type="hidden" name="new" value="${new}" />

试一下,现在你就能编辑新页面了