我们上一章制作都原始 HTTP 服务器 虽然能顺利的处理请求和响应,但是它只是一个 纯静态
的服务器,比如我希望用户能够登陆、发帖、私信、留言... 这些 动态的
功能,它通通不能完成。
如何才能让服务器能够执行动态的内容?一般是通过 Python
或者 PHP
来处理,之后再把处理完的结果在提交到 HTTP 服务器
,服务器在响应到客户端。wsgi
就是 Python
到 HTTP
的一条通道。类似的这种 “通道” 或者较叫“接口” 的还有 CGI、FastCGI
...
Apache、Nginx
等 HTTP服务器软件都是只负责处理 HTTP 的请求和响应,然后我们的 Python、PHP
在通过类似 wsgi
这样的接口与之融合。
wsgi
接口实现起来非常简单,只是通过一个函数,这个函数有两个参数,一个是请求,另一个是响应。
def application(environ, start_response):
pass
# environ 是客户端的请求信息,python 处理完成之后,通过 start_response 响应反馈给 HTTP 服务器
# ...
wsgiref 是 python 内置的一个简单的 遵循wsgi接口的服务器
。
from wsgiref.simple_server import make_server
# application 由wsgi服务器调用、函数对http请求与响应的封装、使得Python专注与HTML
# environ http 请求 (dist)
# start_response 响应 (function)
def application(environ, start_response):
# 请求
if environ['REQUEST_METHOD'] == 'GET' and environ['PATH_INFO'] == '/':
# 响应
start_response('200 OK', [('Content-Type', 'text/html')])
return [b'<h1>hi, py!</h1>']
# 启动服务器 | 这个服务器负责与 wsgi 接口的 application 函数对接数据
httpd = make_server('127.0.0.1', 8000, application)
# 监听请求
httpd.serve_forever()
访问
- 127.0.0.1:8000
web 编程就是对HTTP协议的应用,我们能使用 socket
自制 web 服务器,但每次都需要自己处理协议的内容很烦琐,所以可以把HTTP协议的东西外包给专门的HTTP服务器软件,而 python 就只是单纯的负责处理业务,在通过 WSGI
把两者关联起来。
但仅仅通过 WSGI
去开发 web,还是会过于底层,于是又发展出了 框架
这种东西,例如 Flask
、Django
。它们又在 WSGI 之上在抽象了一层,让 python 可以更方便的处理业务。