Python WSGI规定了Web服务器和Python Web应用程序或Web框架之间的标准接口,主要是为了促进Web应用程序在各种Web服务器上的可移植性。
1.WSGI接口
WSGI的含义:Web Server Gateway Interface(Web服务器网管接口)。
WSGI接口包含两方面:server/gateway端 及 application/framework端。后面直接使用server和application来说明,不再使用gateway和framework。server端直接调用application端提供的可调用对象。另外在server和application之间还可以有一种称作middleware的中间件。中间件对于server来说就是一个application,但是对于application来说中间件却是一个server。
WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求。我们来看一个最简单的Web版本的“Hello, Html!”。
2.实例
我们先编写app.py,实现Web应用程序的WSGI处理函数:
# -*- coding: utf-8 -*-
# @Time : 2022/5/11 9:00
# @File : app.py
# @Software : PyCharm
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b'<h1>Hello, Html!</h1>']
然后,再编写一个 wsgidemo.py,负责启动WSGI服务器,加载application()函数:
# 从wsgiref模块导入:
from wsgiref.simple_server import make_server
# 导入我们自己编写的application函数:
from app import application
# 创建一个服务器,IP地址为空,端口是8000,处理函数是application:
httpd = make_server('', 8000, application)
print('Serving HTTP on port 8000...')
# 开始监听HTTP请求:
httpd.serve_forever()
确保以上两个文件在同一个目录下,然后在命令行输入wsgidemo.py来启动WSGI服务器。
启动成功后,打开浏览器,输入http://localhost:8000/,就可以看到结果了:

如果你觉得这个Web应用太简单了,可以稍微改造一下,从environ里读取PATH_INFO,这样可以显示更加动态的内容:
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html;charset:utf-8')])
# environ['PATH_INFO'].encode('iso-8859-1').decode('utf8')[1:] 解决中文乱码问题
body = '<html><head><meta charset="utf-8"></head><h1>Hello, %s!</h1></html>' % (environ['PATH_INFO'].encode('iso-8859-1').decode('utf8')[1:] or 'Html')
return [body.encode('utf-8')]
你可以在地址栏输入用户名作为URL的一部分,将返回Hello, xxx!:

小结:
python处理Web应用程序,入口都是一个WSGI处理函数。HTTP请求的所有输入信息都可以通过environ获得,HTTP响应的输出都可以通过start_response()加上函数返回值作为Body。复杂的Web应用程序,只靠一个WSGI函数来处理还是太底层了,我们需要在WSGI之上再抽象出Web框架,进一步简化Web开发。