一直想看tornado源码,今天看了Application类,Application的主要作用是接收来自httpserver的httprequest,然后根据httprequest中的host和path来寻找匹配的RequestHandler。
首先Application的构造函数有很多参数
handlers --- 一大堆匹配规则(正则表达式)和requesthandler的元组。
default_host --- 默认主机,如果找不到对应host的handler,则将页面跳转到http://{{default_host}}/页面(只是个猜测,我没有测试过)。
transforms --- 这个不知道是干嘛的。
ui_modules --- 指定当前application对象的ui模块,可以传模块,list和UIModule
ui_method --- 制定当前application的ui_method对象,同样可以传module, list和func。(ui_method就是那些在template中定义的方法)
static_path --- 静态文件地址
static_url_prefix --- 静态文件请求的url前缀,默认是/static/
static_handler_class --- 静态文件对应的处理类型,默认是tornado自带的StaticFileHandler,可以自己写。
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是要上线的。
下个月跟小伙伴参加淘宝的黑客马拉松,要给力呀。
tornado.Application,布布扣,bubuko.com
原文:http://www.cnblogs.com/Mreleven/p/3857356.html