WSGI

简介

Web服务器网关接口(WSGI)是用于Python编程语言的Web服务器(Web Server)Web应用程序或框架(Web application or frameworks)之间的简单通用接口的规范。

WSGI有两端:一端是“服务器(server)”或“网关(gateway)”(通常是诸如Apache或Nginx的Web服务器);另一端是“应用程序”或“框架”。为了处理WSGI请求,服务器端执行应用程序,并向应用程序端提供环境信息和回调函数。应用程序处理请求,并使用它提供的回调函数将响应返回给服务器端。

在服务器和应用程序之间可能会有一个WSGI中间件,它实现了两端的API。服务器收到来自客户端的请求,并将其转发给中间件。处理完成后,它向应用程序发送一个请求。应用程序的响应由中间件转发到服务器,最终转发给客户端。可能有多个中间件形成一个WSGI兼容应用程序的堆栈。

“中间件”组件可以实现如下功能:

  • 根据环境变量,将目标URL的请求路由到不同的应用程序对象。
  • 允许多个应用程序或框架在同一个进程中并行运行
  • 负载均衡和远程处理,通过网络转发请求和响应
  • 执行后处理,例如应用XSLT样式表

Python WSGI接口

我们来看下整体的结构图:


WSGI_第1张图片
WSGI结构图
应用端接口

再Python 3.5中,应用程序端的接口如下所示:

def application(environ, start_response):
    body = b'Hello world!\n'
    status = '200 OK'
    headers = [('Content-type', 'text/plain')]
    start_response(status, headers)
    return [body]

这里的应用程序对象的规范是:

  • 必须是包含environ和start_response参数的可调用对象---environ包含了所有的请求信息,start_response是application处理完后需要调用的函数,参数是状态码、响应头部还有错误信息
  • 在发送body之前必须调用start_response回调函数
  • 必须返回一个包含body的迭代器
服务器端接口

WSGI服务器与这个应用程序的接口如下:

def write(chunk):
    '''Write data back to client'''
    ...

def send_status(status):
   '''Send HTTP status code'''
   ...

def send_headers(headers):
    '''Send HTTP headers'''
    ...

def start_response(status, headers):
    '''WSGI start_response callable'''
    send_status(status)
    send_headers(headers)
    return write

# Make request to application
response = application(environ, start_response)
try:
    for chunk in response:
        write(chunk)
finally:
    if hasattr(response, 'close'):
        response.close()
参考
  1. Web Server Gateway Interface
  2. WSGI: The Server-Application Interface for Python
  3. flask 源码解析:应用启动流程

你可能感兴趣的:(WSGI)