在项目中遇到需要的重定向的部分,但是又不想将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这个函数了,而不是去修改他原来的源码了。