WSGI

本文详细介绍了WSGI(Web服务器网关接口)的概念及其工作原理。WSGI定义了Web服务器和Web应用程序之间的接口,使得Web应用能够跨平台运行。文章还解释了WSGI组件,包括应用程序端如何实现HTTP处理函数及服务器端如何接收并处理HTTP请求。

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请求时

  1. wsgi server会调用这个wsgi application,
  2. 这个对象接收两个参数,通常为environ,start_response ,
  3. 最终将response headers/status 返回给wsgi server。
  4. 此外这个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:

  1. 接收 HTTP 请求,但是不关心 HTTP url, HTTP method 等
  2. 为 environ 提供必要的参数,实现一个回调函数 start_response,并传给 callable object
  3. 调用 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值