wsgiref源码学习

        WSGI是Web Service Gateway Interface的缩写。以层的角度来看,WSGI所在层的位置低于CGI。但与CGI不一样的是WSGI具备很强的伸缩性且能运行于多线程或多进程的环境下。PEP3333中有对WSGI的描述。python


 

 首先看下Python中的wsgiref包含的模块服务器

            


  • validate:提供一个验证,用于验证是否符合WSGI标准多线程

  • simple_server:一个中间服务器用于处理服务器和应用之间的信息传输app

  • handler:服务器和网关直接的执行句柄函数

  • + -headers:HTTP头的相关定义url

  • util:url和环境的配置spa


其次看下各个模块对应的运行分析:线程

headers:code

对HTTP头的相应部分的头部进行组合,这里是headers中的相应的操做。server

util

这里定义的是一个FileWrapper类和URL相关的函数以及与环境配置相关的函数

validate

这里主要是经过validator调用warpper和check来进行WSGI的相应的检测工做

simple_server

这里WSGIServer类继承自HTTPServer,WSGIRequestHandler类继承自BaseHTTPRequestHandler,ServerHandler继承自handler包中的SimpleHandler类

以后demo_app函数代码:

def demo_app(environ,start_response):
    from StringIO import StringIO
    stdout = StringIO()
    print >>stdout, "Hello world!"
    print >>stdout
    h = environ.items(); h.sort()
    for k,v in h:
        print >>stdout, k,'=', repr(v)
    start_response("200 OK", [('Content-Type','text/plain')])
    return [stdout.getvalue()]

函数传入两个参数,environ字典和start_response是一个调用函数

make_server函数代码:

def make_server(
    host, port, app, server_class=WSGIServer, handler_class=WSGIRequestHandler
):
    """Create a new WSGI server listening on `host` and `port` for `app`"""
    server = server_class((host, port), handler_class)
    server.set_app(app)
    return server

函数须要(主机名,端口号),处理请求的handle类,已经须要调用以前写好的app。set_app 设置了 app,它会在 handler_class (默认为WSGIRequestHandler)的handle函数中被取出来,而后交给 handler 的 run 函数运行。

handler

这里SimpleHandler继承自BaseHandler类,BaseCGIHandler继承自SimpleHandler类,CGIHandler继承自BaseCGIHandler

相关文章
相关标签/搜索