zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    VS2015使用scanf报错解决方案
    C++的标准模板库(STL)简介
    C++中常用特殊符号简介(& , * , : , :: , ->)
    C++中#include <xxx.h>和#include "xxx.h"的区别(尖括号和双引号的区别)
    C++中#include的工作原理
    opencv中Mat与IplImage,CVMat类型之间转换
    C++数据类型简析
    让你在DOS中任意切换目录
    七种Prolog解释器/编译器
    C++中引用(&)的用法和应用实例
  • 原文地址:https://www.cnblogs.com/albzcj/p/4305237.html
Copyright © 2011-2022 走看看