在Google App Engine中实现URL伪静态

标签:Google App Engine, Python

在Apache和IIS等Web服务器上,实现伪静态是通过URL重写的方式;但在GAE中方式则不同,需要你在Python代码中实现,不过因此也更为强大和简单。

先来看看伪静态有什么用:
这是一个动态页面:
http://www.keakon.cn/bbs/viewthread.php?tid=35&page=100
这是一个伪静态后的动态页面:
http://www.keakon.cn/bbs/thread-35-100-1.html
这2个页面都是一样的,不过下面的网址明显要短些,而且更符合搜索引擎的“口味”。
它的实现是用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条评论 你不来一发么↓

    想说点什么呢?