tornado—–Handler Url正则

转自:http://my.oschina.net/jiemachina/blog/204878

tornado(二)—–Handler Url正则

handler url正则匹配, get/post

1. 简单

    application = tornado.web.Application([
        (r'/', MainHandler)
    ], **settings) 

2. 带有参数

    class ProfileHandler(RequestHandler):
            def initialize(self, database):
                self.database = database

            def get(self, username):
                print username

        app = Application([
            (r'/user/(.*)', ProfileHandler, dict(database=database)),
            ])

这段代码来至tornado.web.RequestHandler的initialize的注释中,上面的(.*)就是用来匹配 get方法中的参数,如: 第一个(.*) 匹配 username; 那如果想要get有多个参数:如get(self, username, password); 那么配置r'/user/(.*)/(.*)'就可以了第二(.*)正则匹配组的值;列举几个例子吧:

如下:

url: localhost:9002/user/
hander_parse: (r'/user/', ProfileHandler)
get(self):

-------------------------------------------
url:localhost:9002/user/username/password
hander_parse: (r'/user/(.*)/(.*)', ProfileHandler)#这里主要正则匹配url,
get(self, username, password):
    print username, '  ', password

-------------------------------------------
url:localhost:9002/user/username_password
hander_parse: (r'/user/(.*)_(.*)', ProfileHandler)
get(self, username, password):
    print username, '  ', password

那如果像在url中传递很多的参数的时候,这样写get方法不会就有很多参数???所以还有一种简单的方法

get(self, *args):
    print str(args)

所以上面说了那么多的废话,以后就都用这种吧;

3. 理解正则匹配的过程

在Application中debug,就可以查看tornado.web.py的源码. 
从:

(r'/profile/(.*)', ProfileHandler, dict(database="mysql"))

—-> 转化成

URLSpec(r'/profile/(.*)', ProfileHandler, dict(database="mysql"))
# 会把所有的URLSpec放到self.handlers 中

然后RequestHandler的子类会

kwargs={'database': 'mysql'} 

—>

调用 RequestHandler.initialize(**kwargs)

所以当有dict(database=database)

(r'/user/(.*)', ProfileHandler, dict(database=database)),

的时候就可以有:

def initialize(self, database):
    self.database = database
原文地址:https://www.cnblogs.com/albzcj/p/4305237.html