转自: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