Django学习之wsgiref模块
在web的开发中,服务器端的程序,可以分为服务器程序(框架),与应用程序(业务逻辑处理)。服务器程序(框架)负责将客户端的http请求接收,整理。而应用程序负责具体的业务逻辑处理。
一般为了方便开发,经常将服务器程序的功能封装起来,成为各种web开发框架,比如Flask、Django等,不同的框架具有不同的开发方式,但是无论如何,开发出来的应用程序必须和框架相互配合,才能为用户提供服务。
在Python的web开发中,这个标准被称为 the web server gateway interface,简称为WSGI。WSGI是服务器程序与应用程序之间约定的标准,规定了双方按照什么样的接口,提供什么功能,以便以最小的代价实现两者的配合使用。
最简的web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件接收用户请求,从文件中读取HTML再返回。
如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接收HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没有开始写动态HTML呢,就的花个把月去读HTTP规范。
正确快捷的做法是底层代码由专门的服务器软件来实现,我们用python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口协议来实现这样的服务器软件,让我们专心用python编写web业务。这个接口就是WSGI.
什么是WSGI?
WSGI(Web Server Common Interface Web服务器网关接口) 是专门为python语言指定的web服务器与应用程序之间的网关接口规范,它主要分为两个程序部分:服务器部分和应用程序部分。WSGI(web服务器网关接口)是用Python编写web服务器软件和web应用程序之间的标准接口。有了这个标准的接口,就可以很容易地将支持WSGI的应用程序与许多不同的web服务器一起使用。

wsgi让应用程序和web服务之间解耦,应用程序只需要遵守规范,就可以在各种不同的web服务部署运行。比如上图中,基于flask/django实现的应用程序可以使用gunicorn部署,也可以使用nginx+uwsgi部署。
wsgi是 python web框架中的标准,实现了wsgi协议就能写出一个web框架。而wsgiref模块就是python基于WSGI协议开发的服务模块。所以,wsgiref模块其他只干了两件事情:
--->按http请求协议解析数据
--->按http响应协议组装数据
基于wsgiref‘编写server端

from wsgiref.simple_server import make_server
def application(environ,start_reponse):
start_reponse('200 ok',[('content-type','text/html')])
return [b'hello web!']
#类似socket的创建socket对象,绑定端口,开启监听 3步
conn = make_server('127.0.0.1' , 8000 , app = application)
#类似socket的建立连接,等待用户请求
con.serve_forever()
先理一下整套流程:首先 make_server创建好了socket对象,serve_forever就等到用户链接,若收到用户请求
则调取 application函数,注意注意,这个函数并不是我们自己去调,这两个参数我们是没法提供的,而是由
WSGI服务器来调,因为python的wsgiref模块也就是一个内置的WSGI服务器,所以它可以去调用这个函数。
运行一下,是可以正常访问的,如下

application()的两个参数:
environ:一个包含所有HTTP请求信息的dict对象;
start_response:一个发送HTTP响应的函数。
打印这个environ看下
既然请求头被解析成了dic对象,那我们就可以根据头部的路径,来判断用户究竟是请求那么页面的信息了
代码再改动,如下
from wsgiref.simple_server import make_server
def application(environ, start_reponse):
start_reponse('200 ok ' ,[('content-type' , 'text/html' ) ] )
data = environ.get('PATH_INFO')
if data == 'login' :
with open ('login.html' ,'r' ) as f:
data2 = f.read()
elif data == '/index' :
with open ('index.html' , 'r' ) as f:
data2 = f.read()
return [data2.encode('gbk')]
#类似socket的创建socket对象,绑定端口,开启监听 3步
conn = make_server('127.0.0.1' , 8000 , app = application)
#类似socket的建立连接,等待用户请求
con.serve_forever()
效果,访问不同的url,显示不同的页面
浙公网安备 33010602011771号