一、简介:
WSGI(Web Server Gateway Interface)python web开发的标准,它定义了Web服务器和Web应用程序之间通信的接口规范。
流程:
1. 应用程序接收environ、
start_response这两个参数,返回一个可迭代的对象
environ:
一个包含所有HTTP请求信息的dict
对象
start_response:
一个发送HTTP响应的函数,该函数接收两个参数,一是HTTP响应码,二是HttpHeader元祖列表
2. 将应用程序注册到服务器上
3. 服务器接收、解析请求,事先准备好environ和start_response,然后调用注册的应用程序。
二、Demo:
# hello.py
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
result = 'Hello, WSGI!'
# return result #python3 直接返回字符串会报错
return [result.encode()] # 转成字节列表
# run.py
from wsgiref.simple_server import make_server # 使用python内置的WSGI服务器
from hello import application
if __name__ == '__main__':
httpd = make_server('0.0.0.0', 8080, application) # 创建一个服务器,可接收ip地址,端口是8000,应用程序是application:
print("SERVER RUN ON 8080")
httpd.serve_forever() # 开始监听HTTP请求:
注:python3中WSGI应用程序报 AssertionError: write() argument must be a bytes instance错误原因及解决方法
# 直接看源码,其中self.result就是我们应用程序application返回的结果
def finish_response(self):
for data in self.result:
self.write(data)
def write(self, data):
assert type(data) is bytes, \
"write() argument must be a bytes instance"
# 解决方法:将返回结果编码为字节并添加到列表中,如 [result.encode()]
# 注:不可使用list(result.encode())