• 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产生混乱。

  • 相关阅读:
    kvm系列之二:kvm日常管理
    kvm系列之一:构建kvm虚拟机(centos7)
    cobbler无人值守安装
    判断我们的服务器是物理机还是虚拟机
    kickstark无人值守安装
    找回密码之单用户模式
    rsync传输引起的网络延迟
    题解 P3628 【[APIO2010]特别行动队】
    题解 P3211 【[HNOI2011]XOR和路径】
    题解 POJ1094 【Sorting It All Out】
  • 原文地址:https://www.cnblogs.com/zengyh-1900/p/4196695.html
Copyright © 2020-2023  润新知