← 返回首页
Python3基础教程(七十六)
发表时间:2022-05-09 09:14:52
WSGI接口

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开发。