- 用户友好的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}" />
试一下,现在你就能编辑新页面了