WSGI 是什么?是一种规范,用来规范 Python web 应用与服务器之间通信的标准。好比你和老外说话也需要建立一种事先制定的语言来沟通一样。如果今天你碰一德国人,然后你就去学德语,如果碰到日本人,然后去学日语,这样累死了,干脆定一种标准,大家都说英语好了。全世界通用,同样的道理,在python语言中,web框架多如牛毛,这么多框架如果大家都不遵守规则,然后写服务器也没啥规范,这个世界就乱套了,因此 python2.5 就提出了 WSGI,PEP3333。
cherrypy 除了作为 web server外,其实他还是一个 web framework,其宣称是 A high-speed, production ready, thread-pooled,generic HTTP server。
gunicorn 就是一个纯粹的 web server。他使用的pre-fork模型,使用一个central master 进程,用来管理多个 worker processes。这些 worker processes 直接处理请求。
Tornado同时是web应用开发框架和网络库,用来处理异步操作。同时有自己的 WSGI server。
Twisted Web 来自于 Twisted 网络库
uWSGI是一个很全面的项目,目标是提供全栈式服务,uWSGI server 就是其中的一个组建.
mod_wsgi是一个WSGI兼容的模块,能够在 Apache HTTP Server 上运行 WSGI应用.
WSGI 应用接口由一个 callable 对象实现,这个 callable 对象可以是 function,method,class,或者是显现的 call 的实例方法。这个 callable 只要满足以下两个条件:
application 的骨架代码:
#这个就是我们的application 对象, 名字随便取,但是如果你用mod_wsgi的话,就必须叫"application"
def application(#接收两个参数
#字典对象,包含类似CGI的环境参数,从客户端接收过来的请求有server填充
environ,
#start_response是一个回调函数,由server提供.用来发送HTTP status和header给server
start_response):
#响应体
response_body = "The request method was %s" % environ['REQUEST_METHOD']
#状态码
status = "200 OK"
#响应头
response_headers = [('Content-Type':'text/plain'),
('Content-Length':str(len(response_body)))]
#发送给server
start_response(status, response_headers)
#把响应体返回给server
#注意:尽管response_body是一个iterable,但是要包装成list,否则server会单个字节的发送给client.
return [response_body]
python 标准库中提供了 wsgiref 模块提供了一个参考实现。
from wsgiref import make_server
httpd = make_server(
'localhost',
8000,
application
)
httpd.handle_request()
