WSGI

Posted ycg-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WSGI相关的知识,希望对你有一定的参考价值。

WSGI

什么是WSGI?

wsgi 是一个 web 组件的接口规范(WSGI is the Web Server Gateway Interface. It is a specification that describes how a web server communicates with web applications, and how web applications can be chained together to process one request.),wsgi将 web 组件分为三类: web服务器,(web中间件),web应用程序

wsgi server

基本工作流程
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信息塞回给客户端

wsgi application

wsgi application就是一个普通的可调用的对象,当有请求到来时,wsgi server会调用这个wsgi app。这个对象接收两个参数,通常为environ,start_response。environ就像前面介绍的,可以理解为环境变量,跟一次请求相关的所有信息都保存在了这个环境变量中,包括服务器信息,客户端信息,请求信息。start_response是一个callback函数,wsgi application通过调用start_response,将response headers/status 返回给wsgi server。此外这个wsgi app会return 一个iterator对象 ,这个iterator就是response body。

WSGI规定:

1. 应用程序需要是一个可调用的对象

可以是函数
可以是一个实例,它的类实现了__call__方法
可以是一个类,这时候,用这个类生成实例的过程就相当于调用这个类

2. 可调用对象接收两个参数
这样,如果这个对象是函数的话,它看起来要是这个样子:

# callable function
def application(environ, start_response):
    pass


如果这个对象是一个类的话,它看起来是这个样子:

# callable class
class Application:
    def __init__(self, environ, start_response):
        pass    


如果这个对象是一个类的实例,那么,这个类看起来是这个样子:

# callable object
class ApplicationObj:
    def __call__(self, environ, start_response):
        pass

 

3.可调用对象要返回一个值,这个值是可迭代的。

Django中的wsgi

https://www.jianshu.com/p/679dee0a4193

以上是关于WSGI的主要内容,如果未能解决你的问题,请参考以下文章

tornado 启动WSGI应用(Flask)使用多线程将同步代码变成异步

python编写的一个简单那的WSGI PDF server 的代码

Python--WSGI

在 WSGI 容器中使用扭曲的词

在没有 root 的情况下重新加载 django wsgi 脚本

mini-web框架-WSGI-mini-web框架-web服务器集成动态请求的功能(5.1.2)