09 基于模块wsgiref版web框架

模块引入

真实开发中的python web程序,一般会分为两部分:

      服务器程序:负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理;

     应用程序:负责具体的逻辑处理。

为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。

这样,服务器程序就需要为不同的框架提供不同的支持。这样混乱的局面无论对于服务器还是框架,都是不好的。对服务器来说,需要支持各种不同框架,对框架来说,只有支持它的服务器才能被开发出的应用使用。最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。

正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口协议来实现这样的服务器软件,让我们专心用Python编写Web业务。

这时候,标准化就变得尤为重要。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。

WSGI(Web Server Gateway Interface)就是一种规范,它定义了使用Python编写的web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。

常用的WSGI服务器有uwsgi、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器。

服务器server端python程序(wsgiref模版):

 from wsgiref.simple_server import make_server

 def application(environ,start_response):

     """

     wsgiref.simple_server模块中的make_server方法调用的函数

     :param environ: wsgiref模块中封装好的包含http请求所有信息的字典

     :param start_response: wsgiref提供的内置方法(用于响应格式的发送)

     :return:返回给浏览器的信息(以[]包装的bytes类型)

     """

     # environ变量是模块自行封装好的http请求信息,以键值对的形式存在,可以直接字典取值

     print(environ)     

     print(environ["PATH_INFO"])         # 打印请求的文件路径   

     print(environ["REQUEST_METHOD"])    # 打印请求的方式 

 # 服务端响应格式信息(状态信息和请求头部)

     start_response("200 OK",[("Content-Type","text/html")]) 

     return [b'<h1>hello</h1>']  # 服务端返回数据用[]包装起来

 #进行bind端口绑定、listen监听、封装http请求信息、

 # 调用application函数(自动传递封装好的请求信息字典和wsgiref模块内置的响应格式发送函数)

 htttpd=make_server("127.0.0.1",8888,application)

 htttpd.serve_forever()          #accept获取客户端端的连接,开启线程、发送服务端的返回信息

服务器server端python程序(wsgiref模版)

wsgiref模块:

将http请求封装成以键值对的形式封装成字典environ

"PATH_INFO"对应的值为请求文件路径,

QUERY_STRING”对应的值为get请求发送的数据

“REQUEST+METHOD”对应的值为请求方式。

同时封装一个发送响应格式的函数start_server;

通过特定的方式return [ ]返回数据并调用内置方法返回给浏览器。

客户端浏览器访问:

在浏览器地址栏直接输入地址端口:127.0.0.1:8888

基于wsgiref模块返回网页实例:

 from wsgiref.simple_server import make_server

 def func_html():

     with open("index.html","rb")as f:

         return f.read()

 def func_ico():

     with open("favicon.ico","rb")as f:

         return f.read()

 # make_sever自动调用的方法

 def application(environ,start_response):

     # 从封装好的请求信息字典找到请求文件路径

     path = environ["PATH_INFO"]

     # 发送响应信息(状态、响应头部信息可有可无)

     start_response("200 OK",[("Content-Type","text/html")])

     # data表示要返回给浏览器的数据信息

     for mapper in func_mappers:

         if path == mapper[0]:

             data=mapper[1]()

             break

     else:

         data=b"Sorry:404 not find"

     # 固定格式返回

     return [data]

 # 请求文件路径对应的返回数据读取操作映射

 func_mappers=[

     ("/",func_html),

     ("/favicon.ico",func_ico)

 ]

 # 程序启动位置:

 httpd=make_server("127.0.0.1",8888,application)

 httpd.serve_forever()

基于wsgiref模块返回网页实例

实例相关文件:

 <!DOCTYPE html>

 <html lang="en">

 <head>

     <meta charset="UTF-8">

     <link rel="icon" href="favicon.ico">

     <style>

         span{

             background-color: yellow;

             color: red;

             font-size: 20px

         }

     </style>

     <title>动态页面</title>

 </head>

 <body>

     <div>

         <h1>本次访问时间为:

             <span>#time#</span>

         </h1>

     </div>

 </body>

 </html>

index.html

09 基于模块wsgiref版web框架的更多相关文章

  1. koa : Express出品的下一代基于Node.js的web框架

    https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434501579966a ...

  2. 02 初级版web框架

    02 初级版web框架 服务器server端python程序(初级版): import socket server=socket.socket() server.bind(("127.0.0 ...

  3. 01 基础版web框架

    01 基础版web框架 服务器server端python程序(基础版): import socket server=socket.socket() server.bind(("127.0.0 ...

  4. 2、基于wsgiref模块DIY一个web框架

    一 web框架 Web框架(Web framework)是一种开发框架,用来支持动态网站.网络应用和网络服务的开发.这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方 ...

  5. 搭建简易的WebServer(基于pyhton实现简易Web框架 使用socket套接字)

    1. 使用web底层socket的方式实现简易服务器的搭建,用来理解学习 # 1.导入socket模块 import socket import re import gevent import sys ...

  6. 基于servlet实现一个web框架

    servlet作为一个web规范.其本身就算做一个web开发框架,可是其web action (响应某个URI的实现)的实现都是基于类的,不是非常方便,而且3.0之前的版本号还必须通过web.xml配 ...

  7. 自定义mvc或mtv框架:基于wsgiref的web框架

    把mvc或mtv框架的model数据库,view:html,control逻辑处理,url判别,wsgiref集中在一个文件 代码如下 #!/usr/bin/env python #-*- codin ...

  8. cowboy-高性能简洁的erlang版web框架

    那么Cowboy是什么呢? Cowboy is a small, fast and modular HTTP server written in Erlang. 其定位非常明确: Cowboy aim ...

  9. 基于node.js的web框架express

    1.安装node.js方法: window :https://nodejs.org/en/ linux:http://www.runoob.com/nodejs/nodejs-install-setu ...

随机推荐

  1. 数组的forEach和map和for方法的区别

    一.定义 foreach():  从头到尾遍历数组,为每个元素调用指定的函数. map():  将调用的数组的每个元素传递给指定的函数,并返回一个数组,他包含该函数的返回值. 传递的函数是 forea ...

  2. python学习08排序算法举例

    '''''''''排序算法:前提是所有数按照从小到大的顺序排列.1.冒泡算法将第一数与第二个数比较大小,如果第一个数比第二个数大,则沉底(交换位置,使大数在小数后面,这个过程类似于大泡沉底的过程) ' ...

  3. Docker镜像与仓库(四)

    Dockerfile方式创建镜像 https://hub.docker.com/_/centos/ #找一个centos6.6 的dockerfile链接 [root@linux-node1 ~]# ...

  4. 写了Bug,误执行 rm -fr /*,我删删删删库了,要跑路吗?

    每日英语,每天进步一点点(偷笑): 前言 临近五一节,想到有 5 天假期,小林开始飘了. 写个简单的 Bash 脚本都不上心了,写完连检查都不检查,直接拖到到实体服务器跑. 结果一跑起来,发生不对劲, ...

  5. Android程序中Acticity间传递数据

    在Android开发过程中,在不同的Acitivity之间传递数据的情况是非常常见的.我花费了一点时间来总结Acitivity之间的数据传递,记录下来. 1.简单传递键值对 这种传递方式非常简单,只需 ...

  6. Linux / mac OS Shell常用命令

    一.文件.目录操作命令 1.ls命令 功能:显示文件和目录的信息 ls 以默认方式显示当前目录文件列表 ls -a 显示所有文件包括隐藏文件 ls -l 显示文件属性,包括大小,日期,符号连接,是否可 ...

  7. ST函数(ST表)RMQ O(1)查询 离线

    ST算法是基于倍增的动态规划算法. #include<iostream> #include<cstdio> #include<cstdlib> #include&l ...

  8. centos7 源码安装nginx

    1. 安装编译所需要的工具包 yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel 2. 安装ngi ...

  9. Find Minimum in Rotated Sorted Array(旋转数组的最小数字)

    题目描述: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., might become ...

  10. 数据可视化:使用python代码实现可视数据随机漫步图

    #2020/4/5 ,是开博的第一天,希望和大家相互交流学习,很开森,哈哈~ #像个傻子哟~       #好,我们进入正题, #实现功能:利用python实现数据随机漫步,漫步点数据可视化 #什么是 ...