tornado的RequestHandler.reverse_url

在项目中遇到需要的重定向的部分,但是又不想将url写死在项目中,所以就去查看了一下,发现有RequestHandler.reverse_url这个函数,就想去使用,但是他的参数name我一直没有弄明白,按照tornado的官方教程设置url如下:

(r"/hello",HelloHandler,{})

根本就没有name的这个设置项,然后就进源码中去看(在tornado.web中),里面有一个add_handlers函数,其中用到了URLSpec这个类的实例,这个类的初始化的时候是有4个参数如下:

def __init__(self, pattern, handler_class, kwargs=None, name=None):  
    pass

但是在add_handlers中调用的时候就是没有没有name这个参数,实例化的时候根本就没有用到name这个参数,如下:

for spec in host_handlers:
    if type(spec) is type(()):
        assert len(spec) in (2, 3)
        pattern = spec[0] 
        handler = spec[1]
        if isinstance(handler, str):
            handler = import_object(handler)                                
        if len(spec) == 3: 
            kwargs = spec[2]
        else:
            kwargs = {}
        spec = URLSpec(pattern, handler, kwargs)                    

那我该怎么来添加name这个参数然后来使用RequestHandler.reverse_url呢,我想过修改add_handlers这个函数,做如下修改:

(r"/hello", HelloHandler, {}, "hello")

assert len(spec) in (2,3,4)
if len(spec) == 4:
  name = spec[4]
else:
  name = None

当然把上面的添加到add_handlers函数中之后,的确可以使用RequestHandler.reverse_url("hello")这个函数,但是我在想一个框架既然弄出了这个函数那他肯定是可以使用的,不需要我们如此周章的去修改之后才可以使用吧,然后为我就继续去看,然后就发现

了url这个类,其实就是URLSpec类,然后我们在设置url的时候按如下方式设置:

url(r"/hello", HelloHandler, name="hello")

然后就可以直接使用RequestHandler.reverse_url这个函数了,而不是去修改他原来的源码了。

posted on 2012-12-06 19:42  xuchdong  阅读(1803)  评论(0编辑  收藏  举报