在Google App Engine中实现URL伪静态
2009 2 20 02:13 PM 2473次查看
分类:Google App Engine 标签:Google App Engine, Python
先来看看伪静态有什么用:
这是一个动态页面:这2个页面都是一样的,不过下面的网址明显要短些,而且更符合搜索引擎的“口味”。
http://www.keakon.cn/bbs/viewthread.php?tid=35&page=100
这是一个伪静态后的动态页面:
http://www.keakon.cn/bbs/thread-35-100-1.html
它的实现是用URL重写的方式,把thread-开头的链接让viewthread.php来处理,并将后面的2个数字赋值给tid和page。
至于这2个值的获取,在PHP中是通过$_GET这个全局变量来获取的。
在GAE中,它的原理也差不多。
考虑这个动态页面:http://keakon.appspot.com/?tag=博客
你只要在RequestHandler的get方法里使用self.request.get('tag'),就能拿到博客这个值,接着再进行相应处理即可。
但明显这种伪静态方式更好:http://keakon.appspot.com/tag/博客
虽然这样就没法用get来获取那个博客了,但GAE实际上提供了更方便的方式来获取。
来看个例子,为了不被其他代码干扰,我去掉了无关代码,并进行了简化:
class TagHandler(webapp.RequestHandler):
def(self, tag_name):
#找出这个标签的所有blog
blogs = Blog.all().filter('tags', tag_name).order('-date')
#其他处理代码省略
application = webapp.WSGIApplication([
('/tag/(.*)', TagHandler),
])
注意看/tag/(.*)$,它是一个正则表达式,它把所有符合/tag/开头的链接都转给TagHandler类处理,并且把括号中的.*的内容作为TagHandler.get的第2个参数。解释一下.*,它表示任意数目的任意字符;$表示字符串的结尾。所以对于http://keakon.appspot.com/tag/博客这个链接,它就交给TagHandler.get来处理,博客则作为第2个参数tag_name。
当然,你还可以处理后缀名等其他东西,例如这个URL:
http://keakon.appspot.com/image/agZrZWFrb25yDAsSBUltYWdlGJQDDA.jpeg
我们要将其拆成agZrZWFrb25yDAsSBUltYWdlGJQDDA和jpeg两个部分处理:
class GetImage(webapp.RequestHandler):
def get(self, filename):
key = filename.split(".")[0]
image = self.getImage(key)
#其他处理代码略
application = webapp.WSGIApplication([
('/image/(.*)', GetImage),
])
里面那个filename.split(".")就能让URL以小数点为分隔符,分为几个部分,然后我们取第0部分,即可获得agZrZWFrb25yDAsSBUltYWdlGJQDDA这一串字符。说明应该够详细了,建议在WSGIApplication只做初步分析,然后在类里面再进行更细的处理,毕竟太详细的正则表达式很复杂。
0条评论 你不来一发么↓