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,显示不同的页面

posted on 2021-09-25 11:41  hy1698  阅读(249)  评论(0)    收藏  举报

导航