WSGI实现——wsgiref模块源码阅读

WSGI网关接口

  • WSGI (Python Web Server Gateway Interface, Python Web服务器网关接口)是一个Web服务器和Web应用程序之间的标准化接口,用于增进应用程序在不同的Web服务器和框架之间的可移植性。关于该标准的官方说明可以参考PEP333
  • WSGI的主要作用是在Web服务器和Web应用程序承担“翻译官”的角色。对于这一角色可以这样理解:

Web服务器的责任在于监听和接收请求。在处理请求的时候调用WSGI提供的标准化接口,将请求的信息转给WSGI;
WSGI的责任在于“中转”请求和响应信息。WSGI接收到Web服务器提供的请求信息后可以做一些处理,之后通过标准化接口调用Web应用,并将请求信息传递给Web应用。同时,WSGI还将会处理Web应用返回的响应信息,并通过服务器返回给客户端;Web应用的责任在于接收请求信息,并且生成响应。

WSGI规范

  • WSGI规范如下:
  • 服务器的请求处理程序中要调用符合WSGI规范的网关接口;
  • 网关接口调用应用程序,并且要定义start_response(status, headers)函数,用于返回响应;
  • 应用程序中实现一个函数或者一个可调用对象webapp(environ, start_response)。其中environ是环境设置的字典,由服务器和WSGI网关接口设置,start_response是由网关接口定义的函数。

wsgiref包

  • wsgiref包为实现WSGI标准提供了一个参考,它可以作为独立的服务器测试和调试应用程序。在实际的生产环境中尽量不要使用。wsgiref包含有以下模块:
  1. simple_server模块 ——simple_server模块实现了可以运行单个WSGI应用的简单的HTTP服务器。
  2. headers模块 ——管理响应首部的模块。
  3. handlers模块 ——符合WSGI标准的Web服务网关接口实现。该模块包含了一些处理程序对象,用来设置WSGI执行环境,以便应用程序能够在其他的Web服务器中运行。
  4. validate模块 ——“验证包装”模块,确保应用程序和服务器都能够按照WSGI标准进行操作。
  5. util模块 ——一些有用的工具集
    在这里插入图片描述
  • 逻辑流程
  1. 服务器创建socket,监听端口,等待客户端连接。
  2. 当有请求来时,服务器解析客户端信息放到环境变量environ中,并调用绑定的handler来处理请求。
  3. handler解析这个http请求,将请求信息例如method,path等放到environ中。
  4. wsgi handler再将一些服务器端信息也放到environ中,最后服务器信息,客户端信息,本次请求信息全部都保存到了环境变量environ中。
  5. wsgi handler 调用注册的wsgi app,并将environ和回调函数传给wsgi app
  6. wsgi app 将reponse header/status/body 回传给wsgi handler
  7. 最终handler还是通过socket将response信息塞回给客户端。
    *在这里插入图片描述
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()]


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


httpd = make_server('localhost', 8002,  demo_app)
httpd.serve_forever()  # 使用select

参考链接

python之wsgiref模块
Wsgiref 包——符合 WSGI 标准的 Web 服务实现(一)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值