一、HTTP协议:
组装好HTTP请求对象Request,发送给服务器后,我们会得到响应对象Response。这就是我们熟悉的HTTP协议。
每个HTTP请求和响应都遵循相同的格式,一个HTTP包含起始行、Headers和Body三部分,Body是可选的。
HTTP GET请求格式
GET /path HTTP/1.0
Header1:value1
Header2:value2
Header3:value3
HTTP PSOT请求格式
POST /path HTTP1.0
Header1:value1
Header2:value2
Header3:value3
body data xxxxx
HTTP 响应格式
200 ok
Header1:value1
Header2:value2
Header3:value3
body data xxxxx
说明:当报文信息的,头部后面出现换行的时候,就是body部分了。
二、WSGI接口:Web Server Gateway Interface --Web网关接口。
我们知道,一个WEB应用的本质就是:
- 浏览器发送一个HTTP请求
- 服务器接收到请求,生成一个HTML文档
- 服务器把HTML文档作为HTTP响应的body部分发送给浏览器
- 浏览器接收到HTTP响应,从HTTP的body中取出HTML文档并显示
我们要实现一个WEB应用的时候,把用户需要的HTML文件保存好用一个HTTP服务器软件处理用户请求,返回他想要的文件就行。这些IIS、Nginx、Apache等都可以胜任,我们并不需要处理HTTP请求和组装HTTP响应;
但是如果用户请求的是一些动态内容,比如我们要动态生成HTML文件,生成HTML还好说,但是处理HTTP请求信息和HTTP响应信息一定是工作量巨大的,我们要完成HTTP底层的编写,需要大量的时间,还不一定写的就没有BUG。所以Python为了让我们专心写业务代码,他提供了于HTTP、TCP打交道的接口,叫做WSGI。
WSGI接口定义:
def application(enviro,start_response): start_response('200 ok',[('Content-Type','text/html')]) return [b'<h1>你好。。。</h1>']
说明:eviron是包含所有HTTP请求信息的字典对象;start_response是一个发送HTTP响应的函数。return数据作为body发送给浏览器。
调用一次start_response()函数,就发送了一次HTTP响应的Header。start_response()函数第一个参数是HTTP报文起始行--响应码、第二个参数是HTTP报文--头部字段。
WSGI接口说明:
从environ对象中拿到HTTP请求信息,然后根据需求构造HTML,再通过start_response()发送响应Header,最后返回响应Body。
有了这个接口,你不用关心HTTP报文如何解析,是不是很方便。
WSGI接口调用:
WSGI接口要求传入envrion和start_response两个参数,我们都没法提供啊!python内置了一个WSGI服务器,它能够调用application(),这个模块叫wsgiref。下面是一个测试:
1、编写myapp.py来实现WEB应用程序的WSGI处理函数:
#!/usr/bin/env python # -*- coding: utf-8 -*- # 入口 def application(environ,start_response): start_response('200 ok',[('Content-Type','text/html')]) return [b'<h1>welcome here</h1>']
2、编写一个server.py,负责启动WSGI服务器,来加载WSGI函数:
from wsgiref.simple_server import make_server from complexapp import application #创建一个服务 IP地址为空 端口8000 处理函数application http_server=make_server('',8000,application) print('服务开启在8000这个端口上...') #开始监听HTTP请求 http_server.serve_forever()
3、在命令行中,运行server.py文件来启动WSGI服务器,在浏览器中输入127.0.0.1:8000查看结果:
在浏览器中输入:127.0.0.1:8000就可以看到我们application中return的结果:
4、 在命令行中按下CTRL+C就可以终止WEB服务。
最后:麻雀虽小五脏俱全,再复杂的WEB应用程序,入口都是一个WSGI处理函数。