• 一、HTTPServer,RequestHandler,ServerHandler,Handler


    1.      HTTPServer,RequestHandler,ServerHandler,Handler

    1.1       基本概念

    HTTPServer主要是对传输控制层HTTP,TCP,Socket等底层实现细节的一些抽象,典型应用为WSGIServer,其继承关系为: WSGIServer: HTTPServer: TCPServer: SocketServer.BaseServer,对应的类视图如下图:

     

    RequestHandler是对HTTP请求所有操作的抽象,从其成员函数:headers, response, parse_request(), handle_one_request()等即可大致了解其主要工作内容,其典型的应用是WSGIRequestHandler,对应的继承关系为: WSGIRequestHandler: BaseHTTPRequestHander: StreamRequestHandler: SocketServer.BaseRequestHandler。对应的类视图如下:

     

    ServerHandler是对程序运行环境进行抽象,如stdin, stdout, softversion, logging等,主要起辅助作用,其具体工作机制暂时不得知,其有一个重要的成员函数run(self, application),HTTPServer利用该成员函数调用不同的Handler处理不同的请求。

    Handler是对URL请求进行处理的一种抽象,重点偏向上层应用处理,不同的URL请求可能需要不同的处理机制,因此需要定制多种不同的Handler,Handler实体对应Server的application成员,显然,虽然Server在初始化时赋值了该application成员(wsgi_handler),但是程序在运行过程中,随时可以动态调整该成员值以达到调用不同的Handler处理不同Request的目的。Handler的典型应用有staticfileHandler, WSGIHandler。前者的类视图如下图:

     

    Handler实体中loadmiddleware(), get_response(), _get_response(), make_view_atomic()都是非常重要的成员函数,完成对http请求处理的绝大部分操作。

    Django程序通常拥有一个HTTPServer实体,一个HTTPServer实体与一个RequestHandler关联,RequestHandler在handle请求时需要一个ServerHandler实体的支撑,一个ServerHandler实体调用HTTPServer实体对应的多个Handler中一个进行请求处理。

           在Django框架中,WSGI协议是连接Django框架和外部web server的桥梁,起着非常核心的作用,因此在分析过程中通常直接分析WSGISserver,WSGIHandler,WSGIRequestHandler,而不再介绍更抽象的HTTPServer,Handler等,关于这些抽象类的更多应用可以在python目录的test文件夹找到。

    1.2       类视图关系

    WSGISserver,WSGIRequestHandler ,ServerHandler,WSGIHandler之间的关联关系如下图所示:

     

    1.3       初始化及其调用关系

    django.core.management.base.commands.runserver.py

    from django.core.servers.basehttp import get_internal_wsgi_application, run
    handler = self.get_handler(*args, **options) /* WSGIHandler 或StaticFilesHandler */
    run(self.addr, int(self.port), handler, ipv6=self.use_ipv6, threading=threading)

    django.core.servers.basehttp.py

    def run(addr, port, wsgi_handler, ipv6=False, threading=False):
        httpd = WSGIServer(server_address, WSGIRequestHandler, ipv6=ipv6) /*初始化WSGIServer实体,并指定RequestHandler为WSGIRequestHandler */
        httpd.set_app(wsgi_handler)      /*指定applicaton为wsgi_handler */
        httpd.serve_forever()            /*启动服务,接受到来的请求,并处理之*/

    注意,在RunserverCommand:Commond:get_handler()获取Handler时,根据配置参数不同,返回不同的Handler,即WSGIHandler 或者StaticFilesHandler。

    if use_static_handler and (settings.DEBUG or insecure_serving):
        return StaticFilesHandler(handler)
    return handler         /* WSGIHandler*/
  • 相关阅读:
    Keras学习率调整
    机器学习算法的调试---梯度检验(Gradient Checking)
    Python 上下文管理器
    Python垃圾回收机制
    Css 动画的回调
    全新的membership框架Asp.net Identity——绕不过的Claims
    CSS代码重构与优化
    html5 本地存储
    ASP.NET MVC 随想录
    谈谈Angular关于$watch,$apply 以及 $digest的工作原理
  • 原文地址:https://www.cnblogs.com/fbli/p/5925068.html
Copyright © 2020-2023  润新知