深入理解 WSGI
WSGI 是什么?是一种规范,用来规范 Python web 应用与服务器之间通信的标准。好比你和老外说话也需要建立一种事先制定的语言来沟通一样。如果今天你碰一德国人,然后你就去学德语,如果碰到日本人,然后去学日语,这样累死了,干脆定一种标准,大家都说英语好了。全世界通用,同样的道理,在python语言中,web框架多如牛毛,这么多框架如果大家都不遵守规则,然后写服务器也没啥规范,这个世界就乱套了,因此 python2.5 就提出了 WSGI,PEP3333。
python web 框架有哪些?
- Django
- Pyramid
- Tornado
- Flask
- web.py
python wsgi server 有那些?
CherryPy WSGI Server
cherrypy 除了作为 web server外,其实他还是一个 web framework,其宣称是 A high-speed, production ready, thread-pooled,generic HTTP server。
Gunicorn
gunicorn 就是一个纯粹的 web server。他使用的pre-fork模型,使用一个central master 进程,用来管理多个 worker processes。这些 worker processes 直接处理请求。
Tornado
Tornado同时是web应用开发框架和网络库,用来处理异步操作。同时有自己的 WSGI server。
Twisted Web
Twisted Web 来自于 Twisted 网络库
uWSGI
uWSGI是一个很全面的项目,目标是提供全栈式服务,uWSGI server 就是其中的一个组建.
mod_wsgi
mod_wsgi是一个WSGI兼容的模块,能够在 Apache HTTP Server 上运行 WSGI应用.
wsgi 对 web 框架/应用的规范是怎样的?
WSGI 应用接口由一个 callable 对象实现,这个 callable 对象可以是 function,method,class,或者是显现的 call 的实例方法。这个 callable 只要满足以下两个条件:
- 必须接收两个位置参数
- 字典对象
- 一个回调函数,用于发送HTTP 状态码/消息和HTTP头给 server。
- 必须返回响应体给 server,返回对象作为字符串包装在迭代器里面。
application/framework
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]
web server size
python 标准库中提供了 wsgiref 模块提供了一个参考实现。
from wsgiref import make_server
httpd = make_server(
'localhost',
8000,
application
)
httpd.handle_request()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论