首页 > 代码库 > tornado web.py Application类源码剖析

tornado web.py Application类源码剖析

【课程】web2.0程序设计
【作业要求】研究 application 对象源代码。说明 Application 对象实例化时,给出“debug=True”参数,代码动态自动编译的原理。
【参考文档】Application 类源代码   tornado Application 官方文档   debug模式和自动重新加载

 

tornado.web提供了一个简单的Web框架的异步功能。一个请求处理程序的集合就组成了一个web application.

 

1.分析application类的源码我们知道,application类有以下几种方法:

 

·__init__(self, handlers=None, default_host="", transforms=None, **settings)

构造函数,接受一个URLSpec类对象或者一个(正则表达式,被请求的类)的元组作为参数。当我们接受请求时,程序会按顺序遍历列表,并且实例化第一个正则表达式能够匹配的请求类。

对应的元组也可以包括其他部分,参见URLSpec构造函数的参数列表。

其中setting可以做一系列设置。

在tornado中的通用setting有:autoreload,debug,default_handler_classcompress_response,gzip,serve_traceback,log_function,ui_modules,ui_method

身份验证和安全设置的setting:cookie_secretlogin_urlxsrf_cookiesxsrf_cookie_version等等。

模板设置的setting:autoescape,compiled_template_cache,template_pathtemplate_loader

静态文件设置的setting:static_hash_cachestatic_path,static_url_prefix,static_handler_class, static_handler_args

 

·listen(self, port, address="", **kwargs)

 为这个应用在给定的端口启动http服务器。这是一个创建HTTPServer对象并且调用listen函数的简便方法。

注意: HTTPServer.listen不支持的关键字参数通过HTTPServer的构造函数传进来;在高级用途如多进程模式中,不调用这个方法,而是创建一个HTTPServer对象,并且直接调用 TCPServer.bind/TCPServer.start();调用完这个函数之后,还是需要调用IOLoop.instance().start()来开始服务。

 

·_get_host_handlers(self, request)

 获取主机的handlers,若找不到,返回false;

 

以下函数就和构造函数中的setting的一些值相对应:

·_load_ui_methods(self, methods)

·_load_ui_modules(self, modules)

·start_request(self, connection) 

 

·__call__(self, request)
python一个语法特性,使得application可以直接当作函数被调用

 

·reverse_url(self, name, *args)

返回一个handler的URL路径,这个handler必须已经被作为URLSpec被加入application里面,

 

·log_request(self, handler)
一个完整的HTTP请求的记录日志,默认写入root logger.若想改变logs储存的位置,可重写这个方法,或在application的setting字典里传进一个函数作为log_function

 

 

2.现在我们重点分析Application 对象实例化时,给出“debug=True”参数,代码动态自动编译的原理,主要也就是构造函数参数列表中的setting值。

 

如果你将debug=true作为参数传进Application的构造函数,那么这个应用将会在debug模式下运行。在这个模式中,有几个特性是会设置好的,而这些特性也可以单独设置,当两种设置都存在时,单独设置比这样的默认设置优先级高。

特性如下:

autoreload=True当有任何变化时,该应用程序会监视其源文件的更改,并重新加载自身。这减少了开发过程中手动重新启动服务器。然而,某些故障(如在导入时的语法错误)调试模式目前不能直接恢复。
compiled_template_cache=False:模板不会被缓存。
static_hash_cache=False:静态文件的哈希值(static_url函数会使用到的)将不会被缓存
serve_traceback=True‘:当一个RequestHandler的异常没有被捕获,会产生一个错误页,包括一个堆栈跟踪也会产生。

自动重新载入模式和多线程模式不兼容。调试模式的自动载入特性可以作为tornado.autoreload的一个独立的模块,二者可以结合:设置autoreload=True 来检测应用在运行过程中的改变,并用 python -m tornado.autoreload myserver.py 的方法来开启应用,用以捕获异步异常或其他错误。

重载会失去python解释器的命令参数,因为他的再执行使用的是sys.executable 和sys.argv.,所以修改这些值会导致重载方式不正确。在一些平台上,进程不能在适当的位置更新,那么代码的改变被检测到后,旧服务还在,新的服务已经开始了,就会使IDE产生混乱。

tornado web.py Application类源码剖析