WSGI
Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)
Web服务器和Web应用程序或框架之间的一种简单而通用的接口。
WSGI区分为两个部份:一为“服务器”或“网关”,另一为“应用程序”或“应用框架”
The Application/Framework Side
符合WSGI标准的一个HTTP处理函数
Application/framework 端必须定义一个 callable object,
callable object 可以是以下三者之一:
1. function, method
2. class
3. instance with a __call__ method
Callable object 必须满足以下两个条件:
1. 接受两个参数:字典(environ),回调函数(start_response,返回 HTTP
2. status,headers 给 web server)
返回一个可迭代的值
基于 callable function 的 application/framework 样例如下:
def application(environ,start_response):
start_response('200 OK',[('Content-Type','text/html')])#发送了HTTP响应的Header
return '<h1>Hello,web!</h1>'#作为HTTP响应的Body发送给浏览器
基于callable class 的application/framework样例如下:
class ApplicationClass(object):
def __init__(self,environ,start_response):
self.environ = environ
self.start_response = start_response
def __iter__(self):
self.start_response('200 OK',[('Content-Type','text/html')])
yield "hello world!n"
web serber接受请求后,调用application处理一个WSGI请求时
- wsgi server会调用这个wsgi application,
- 这个对象接收两个参数,通常为environ,start_response ,
- 最终将response headers/status 返回给wsgi server。
- 此外这个wsgi app会return 一个iterator对象 ,这个iterator就是response body。
environ:就像前面介绍的,可以理解为环境变量,跟一次请求相关的所有信息都保存在了这个环境变量中,包括服务器信息,客户端信息,请求信息,-->包含所有HTTP请求信息的dict对象
start_response:是一个callback函数,wsgi application通过调用start_response,将response headers/status 返回给wsgi server
start_response()函数接收两个参数,一个是HTTP响应码,一个是一组list表示的HTTP Header,每个Header用一个包含两个str的tuple表示
The Server/Gateway Side
重点是接收 HTTP 请求和提供并发。
每当收到 HTTP 请求,server/gateway 必须调用 callable object:
- 接收 HTTP 请求,但是不关心 HTTP url, HTTP method 等
- 为 environ 提供必要的参数,实现一个回调函数 start_response,并传给 callable object
- 调用 callable object
详细介绍:
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信息塞回给客户端。
编写一个server.py,负责启动WSGI服务器,加载application()函数:
#从wsgi中模块中导入
from wsgiref.simple_server import make_server
#导入我们自己编写的application函数
from hello import application
#创建一个服务器,IP的值为空,端口号8000,处理函数是application
httpd = make_server('',8000,application)
print "Serving HTTP on port 8000..."
#开始监听HTTP请求
httpd.server_forever()
Middleware: Components that Play Both Sides
middleware 中实现以下功能:
1. 根据 url 把用户请求调度到不同的 application 中。
2. 负载均衡,转发用户请求
3. 负载均衡,转发用户请求
4. 限制请求速率,设置白名单
参考:
http://python.jobbole.com/84372/?utm_source=blog.jobbole.com&utm_medium=relatedPosts
廖雪峰
https://www.biaodianfu.com/cgi-fastcgi-wsgi.html
本文详细介绍了WSGI(Web服务器网关接口)的概念及其工作原理。WSGI定义了Web服务器和Web应用程序之间的接口,使得Web应用能够跨平台运行。文章还解释了WSGI组件,包括应用程序端如何实现HTTP处理函数及服务器端如何接收并处理HTTP请求。
1299

被折叠的 条评论
为什么被折叠?



