【课程】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_class,compress_response,gzip,serve_traceback,log_function,ui_modules,ui_method
身份验证和安全设置的setting:cookie_secret,login_url,xsrf_cookies,xsrf_cookie_version等等。
模板设置的setting:autoescape,compiled_template_cache,template_path,template_loader
静态文件设置的setting:static_hash_cache,static_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产生混乱。