一直想看tornado源码,今天看了Application类,Application的主要做用是接收来自httpserver的httprequest,而后根据httprequest中的host和path来寻找匹配的RequestHandler。python
首先Application的构造函数有不少参数正则表达式
handlers --- 一大堆匹配规则(正则表达式)和requesthandler的元组。多线程
default_host --- 默认主机,若是找不到对应host的handler,则将页面跳转到http://{{default_host}}/页面(只是个猜想,我没有测试过)。app
transforms --- 这个不知道是干吗的。函数
ui_modules --- 指定当前application对象的ui模块,能够传模块,list和UIModuletornado
ui_method --- 制定当前application的ui_method对象,一样能够传module, list和func。(ui_method就是那些在template中定义的方法)测试
static_path --- 静态文件地址ui
static_url_prefix --- 静态文件请求的url前缀,默认是/static/url
static_handler_class --- 静态文件对应的处理类型,默认是tornado自带的StaticFileHandler,能够本身写。spa
static_handler_args --- 静态文件处理类型的参数
listen(self, port, address="", **kwargs) 方法建立一个HTTPServer实例,而后调用这个实例的listen()方法。注释中特别说明,若是是多线程的用法不能用该函数,须要显示调用HTTPServer或TCPServer本身的方法。
add_handlers(self, host_pattern, host_handlers)方法的做用是往self.handler中添加handler。这里须要注意若是handler匹配的url中有通配符,那么这个handler的优先级就会降低(排到了后面),若是添加相同的正则表达式会tornado会报异常。
add_transform(self, transform_class)这个函数是往self.transforms增长transform_class,可是transforms到底用来干什么我还不知道。
_load_ui_methods(self, methods)往self.ui_methods中添加方法
_load_ui_modules(self, modules)与_load_ui_method的功能是同样的。
reverse_url(self, name, *args)这个方法不知道是用来干吗的。
log_request(self, handler)这个方法是吧请求写进日志,http状态小于400的都是属于正常状态,大于等于400小于500的都属于警告状态,除了上面的状态以外的都是错误状态。
_get_host_handlers(self, request)这个方法会根据request的host寻找属于这个的handlers,
__call__(self, request)方法使application实例对象变成可调用,它会调用_get_host_handlers(),将获取到的handlers再根据path来肯定具体要使用的handler。它作了一些处理,好比若是没有找到对应host的handlers,那么直接跳转到默认host下面。若是没有找到匹配的Handler那么跳转到默认页面或者抛出404异常。另外它还会根据配置决定是否cache编译好的template文件,是否cache静态文件。
另外我还从代码中发现,若是是debug模式,默认会开启autoreload和serve_traceback功能,关闭compiled_template_cache和static_hash_cache功能,你能够经过在Application的__init__()函数中开启他们。
python 中 setdefault()方法仍是颇有用的,若是字典中没有这个值,那么就添加并赋值,若是有就忽略本次操做。
>>> a = {"name": "eleven"} >>> print a {'name': 'eleven'} >>> a.setdefault("name", "yumi") 'eleven' >>> a.setdefault("age", 23) 23 >>> print a {'age': 23, 'name': 'eleven'}
dict中get()方法在不传第二个参数的状况下若是没有指定的键会返回None,不会报错,我以前还一直指定第二个参数为None。
>>> b = {} >>> print repr(b.get("name")) None
python中or操做就至关因而C中的三目运算符?:
>>> 1 or [] 1 >>> 0 or [] [] >>> 1 if 1 else [] 1 >>> 0 if 0 else [] []
就这样吧,晚上再写点Baade项目的东西,原本昨天Baade是要上线的。
下个月跟小伙伴参加淘宝的黑客马拉松,要给力呀。