/02/22 03-WSGI原理

时间:2024-03-24 14:10:31

**WSGI就是web server gateway interface,指的是网页的服务端,这些提供网页服务的服务端,提供的一种gateway网关,这种网关,它提供的开发编程接口interface,指的是这种东西 **
最早从CGI开始,通用网关接口,common gateway interface,server后面是一种动态内容,就是一种编程语言,需要一种编程语言来和server之间进行交互,交互就需要一套接口,这就是网关接口,很早出现的协议叫通用网关接口,可以用C和C++编程,但是太痛苦,这个时候机顶盒的JAVA就看到了希望,到现在为止,java还是老大地位2020/02/22 03-WSGI原理
从这个技术诞生后,将逻辑抽象出来,通过访问相应的接口来互相直接调用的,网关接口在不断发展,php有php,java有java,python提供了一种专门的协议,就是WSGI,整个python大部分都遵守这个协议
2020/02/22 03-WSGI原理
这图必须背,做web开发,浏览器和server隔着互联网,两端需要靠http协议搭桥,浏览器要访问服务器,就要发起http请求,在这套协议下,http请求先到达server,因为server需要解决tcp链接的问题,但是server拿到tcp链接之后,把链接建立,并发高了,需要解决同步异步,往往server会形成一个独立的application,单独进程,server解决了socket编程,还知道你发过来的是http协议,对http协议能够进行解析,将用户发来的http请求进行解析,解析之后将用户的请求报文中的请求头,和body部分,都需要解析,解析完,server需要将解析的数据打包之后放在environ里面
2020/02/22 03-WSGI原理
WSGI会将这个数据封装到environ这样一个环境数据结构中,封装之后,server解决所有通讯的,解决了tcp和http,剩下的事情不管,剩下的是编程人的事情,程序员就需要写这个APP,server将所有请求数据封装到environ,调用你的程序的时候注入给你,即将environ注入给你,
2020/02/22 03-WSGI原理
environ注入给你APP后,借助WSGI提供的方法,这个方法叫start,response,用这个方法将这一次请求的状态码这些东西还有部分请求头写回去,作为response的header中的一部分,因为没写还需要填写缺省值,返回的编码格式,文件类型都需要告诉对方,这是response的head部分

用open方法打开一个文件,可以把html的内容读取出来,放在response的body部分作为正文部分,返回给server,因为返回的是string,要把你这些内容string封装成http,包装成http的正文,就是http的body部分,返回给浏览器端2020/02/22 03-WSGI原理
感觉上像是app返回的,其实还是你的server2020/02/22 03-WSGI原理
后面整体是个server,浏览器端向server发送请求,这个server恰好支持WSGI协议,就可以通过WSGI提供的要求,为我封装请求,然后封装请求后调用application,一个请求来了让application进行处理,处理完告诉让它发什么头回去,然后再把正文给它,中文一起给server,因为WSGI server是跟客户端建立的socket链接

2020/02/22 03-WSGI原理
也就是数据来的时候先到达server,由server调用application,application处理完后,数据又到了server,由server再给浏览器端,

2020/02/22 03-WSGI原理
server找一个支持WSGI的server就OK,程序员关注的是怎么进行逻辑处理
2020/02/22 03-WSGI原理
WSGI规定了服务器端的服务器和application之间的通讯,把他们的接口规范好了,都是在server端的事情,对于浏览器端来讲,根本就不知道你服务端是WSGIserver还是其他东西。
对于浏览器端只认一个东西,http协议。
WSGI协议这指的是server和application之间的如何通信的问题

2020/02/22 03-WSGI原理
2020/02/22 03-WSGI原理
会了跟源码方便后期会还掉,所以现在用wsgiref。
wsgiref是python提供的一个WSGI参考实现库,不是生产环境用的

有一个简单的server,支持wsgi的webserver有了,还有一个支持wsgi的app都有了
2020/02/22 03-WSGI原理
这是一个标注库,直接导入即可

2020/02/22 03-WSGI原理
有daemon_app

2020/02/22 03-WSGI原理
2020/02/22 03-WSGI原理
所以可以使用里面的一些方法,一般服务是7*24小时运行,server_forever
2020/02/22 03-WSGI原理
运行起来

2020/02/22 03-WSGI原理
这就是一个支持wsgi的server,这个server启动以后绑定在tcp的9999端口,支持http,将请求来的传给daemon_app,来给我们提供响应的内容
2020/02/22 03-WSGI原理
2020/02/22 03-WSGI原理
server把请求封装后,server是调用app,请求的数据封装到了environ环境变量里去,这个变量里封装了所有请求,路径,查询字符串,只要是请求报文的数据都封装到这里
2020/02/22 03-WSGI原理
拿到数据后,start_response,虚线用start_response,是在response之前开始的做的事情,
2020/02/22 03-WSGI原理
server调用这个application,server替我们注入application(server链接了客户端,把客户端信息拿到,所以是server注入的)satrt_response是请求头,请求头是application做的
2020/02/22 03-WSGI原理
真正跟客户端打交道的应该是server做的事情,start_response其实是server注入的。wsgiserver注入的
2020/02/22 03-WSGI原理
start_response是server注入的,只要告诉状态码,就可以发送给客户端,告诉相应类型,文件编码就把response的header发送过去了,提供了一个方法,把你关心的写进来,没写的调用缺省值。
最后进行返回return

2020/02/22 03-WSGI原理
stdout实际上替我们做了一个假文本,其实就是为了拼一个大字符串,下面使用的getvalue,不管字符串多长,现在就问把这些都拿出来,getvalue就是拿全部内容,把全部内容编个码,return出去,application就写完了,把字符串正文部分写完了,写完了事情就不用你管,整个response的http报文封装,由server完成

2020/02/22 03-WSGI原理
这个http正文是要交给server的

2020/02/22 03-WSGI原理

感觉是在application中做了response
2020/02/22 03-WSGI原理
一个http报文分两部分,首先给报文内容,还要告诉报文头部改什么,这两样齐了,server一return就拿到了,因为这个函数是server调用的,一return,server就拿到了返回值了,拿到返回值就需要进行http封装,http封装后变成了response报文,然后响应报文就发到了浏览器端,浏览器就哭看到内容
2020/02/22 03-WSGI原理
这个地方的数据结构是字典,把请求头放到了一个字典中,把请求头里的字典,二元组排个序得到列表后,把这些信息打印了。
2020/02/22 03-WSGI原理
把所有打印的信息,输出到file里去了,这里就重新指定位置了,真正的stdout是sys.stdout,这里的stdout只是一个变量,这个变量指向stringIO对象,2020/02/22 03-WSGI原理
return之前要告诉头是什么,状态,用什么编码

2020/02/22 03-WSGI原理
此函数要求两参,函数叫什么名字无所谓,这两个参数是外部注入的,python要求参数对应,不能多不能少,不像JS,,在return前必须把报文头解决掉,用startresponse,在真正response之前,把头部的信息解决掉,状态码以及必要的一些信息,比如内容类型,编码,都需要注入。
如何把正文给它,就需要给个列表,这个列表就是你的正文,会把你列表里的元素,一个个拼装起来,简单的字符串拼接,拼接成一个比较大的正文发送给客户端。

2020/02/22 03-WSGI原理
这正文需要通过http封装一下

2020/02/22 03-WSGI原理
请求头告诉get方法,访问/根

2020/02/22 03-WSGI原理
response的header放在这里,200 ok,在start_response里写的,server:wsgiserver是缺省信息2020/02/22 03-WSGI原理
response的正文部分在这里,head和body有俩个空行,response就是它返回的html的文件内容
2020/02/22 03-WSGI原理
刚才发起了url,这个url其实是访问的server端口下的根,就访问到了application,application有一个reviron参数,还有一个start_response参数,这两个参数注入到application,application做逻辑处理,最后先调用start_response,再return一个列表,这个列表可以写多项。每一项都会组成response正文,就把这个正文retrurn给了server,由server进行http正文的封装返回到浏览器端

2020/02/22 03-WSGI原理