Python WSGI概述(更新ing)

PEP-0333 -- Python Web Server Gateway Interface v1.0

说明

WSGI是一种规范,描述web server和web application通信的规范。要实现WSGI协议,必须同时实现web server和web application。WSGI的目的就是规范Web服务器和应用(框架)之间的交互。

WSGI 规定每个 python 程序(Application)必须是一个可调用的对象(实现了call 函数的方法或者类),接受两个参数 environ(WSGI 的环境信息) 和 start_response(开始响应请求的函数),并且返回 iterable。
几点说明:

  • environ 和 start_response 由 http server 提供并实现
  • environ 变量是包含了环境信息的字典
  • Application 内部在返回前调用 start_response
  • start_response也是一个 callable,接受两个必须的参数,status(HTTP状态)和 response_headers(响应消息的头)
  • 可调用对象要返回一个值,这个值是可迭代的。

应用,服务器,中间件

  • application:可以被调用的一个对象,一般指包含__call__方法对象
  • server:指实现了调用应用的部分
  • middleware:处于服务器和应用两侧,起粘合作用,具体包括:请求处理,响应,environ处理等

WSGI environ 变量

  • REQUEST_METHOD:HTTP请求类型,例如GET或POST
  • SCRIPT_NAME:URL请求中路径开始的部分,对应应用程序对象(?)
  • PATH_INFO:URL请求路径剩余部分,指定请求目标在应用程序内部的虚拟位置(?)
  • QUERY_STRING:URL请求跟在(?)的部分,可为空或不存在
  • CONTENT_TYPE:HTTP请求中任何Content-Type域的内容,可为空或不存在
  • CONTENT_LENGTH:HTTP请求中任何Content-Length域的内容,可为空或不存在
  • SERVER_NAME,SERVER_PORT
  • SERVER_PROTOCOL

Example:

>>> from webob import Request
>>> from pprint import pprint
>>> req = Request.blank("/article?id=1")
>>> req

>>> pprint(req.environ)
{'HTTP_HOST': 'localhost:80',
 'PATH_INFO': '/article',
 'QUERY_STRING': 'id=1',
 'REQUEST_METHOD': 'GET',
 'SCRIPT_NAME': '',
 'SERVER_NAME': 'localhost',
 'SERVER_PORT': '80',
 'SERVER_PROTOCOL': 'HTTP/1.0',
 'wsgi.errors': ', mode 'w' at 0x7f96529cf1e0>,
 'wsgi.input': <_io.BytesIO object at 0x7f965013db30>,
 'wsgi.multiprocess': False,
 'wsgi.multithread': False,
 'wsgi.run_once': False,
 'wsgi.url_scheme': 'http',
 'wsgi.version': (1, 0)}

wsgiref+Webob+Routs+Paste+PasteDeploy

wsgiref 是实现wsgi规范的模块,提供了操作WSGI环境变量和response头的工具,并还实现了一个WSGI服务器

Webob 提供了封装后的WSGI请求(Request)环境,并辅助创建WSGI响应(Response

Routes 提供是管理URL路由的模块

Paste

PasteDeploy

Paste.ini文件解析

  • filter:实现一个过滤器中间件
  • pipline:把filter串起来
  • app:具体的application
  • composite:将httpd请求分发到指定的application

你可能感兴趣的:(Python WSGI概述(更新ing))