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'\1' % 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"变量{{{
}}}
试一下,现在你就能编辑新页面了