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. 2019-2020-1 20199326《Linux内核原理与分析》第七周作业

    实验内容:分析Linux内核创建一个新进程的过程 初始化Menu Os,输入fork可以看到menuos触发了一个fork系统调用 再开一个shell,进入调试模式,设置几个断点sys_clone,d ...

  2. MYSQL 索引汇总

    1.MySQL索引类型 先分以下类,MYQL有两大类索引:聚集索引和非聚集索引(只考虑mysql innodb) 聚集索引:在有主键的情况下,主键为聚集索引,其他都是非聚集索引             ...

  3. Java高效开发IntelliJ IDEA 2019.1 新特性

    1. 重构类.文件.符号,Action 搜索 IntelliJ IDEA(以下简称 IDEA) 中的搜索可以分为以下几类 类搜索,比如 Java,Groovy,Scala 等类文件 文件搜索,类文件之 ...

  4. mac OS 配置 svn服务器端

    在Windows环境下 一般使用Tortoise SVN来搭建svn环境 操作系统 mac OS High Sierra 10.13.6 在Mac环境下 由于Mac自带了svn的服务器端和客户端功能 ...

  5. 虚拟化学习笔记-KVM虚拟化跨机迁移原理

    参考:https://zhuanlan.zhihu.com/p/27055555 在线迁移过程划分为三个阶段:准备阶段.迁移阶段和切换阶段.迁移环境为虚拟化底层KVM+Qemu.虚拟化管理Libvir ...

  6. [译] React 16.3(.0-alpha) 新特性

    原文地址:What's new in React 16.3(.0-alpha) 原文作者:Bartosz Szczeciński 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/ ...

  7. Hadoop学习笔记(三) ——HDFS

    参考书籍:<Hadoop实战>第二版 第9章:HDFS详解 1. HDFS基本操作 @ 出现的bug信息 @-@ WARN util.NativeCodeLoader: Unable to ...

  8. .html文件转换成.txt

    @ 思路 @-@ 简要 根据尖括号将文件分隔成字符串,建立一套判断字符串是否为标签的标准,若不为标签则为文本内容,存入结果文件中:   @-@ 详述 0. 建立两个哈希表: 哈希表1 unordere ...

  9. python(string 模块)

    1.string 模块下关键字源码定义 whitespace = ' \t\n\r\v\f' ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz' ascii_ ...

  10. TD-LTE华为 DBS3900数据配置实践 典型案例

    案例:华为 DBS3900 双基站二扇区配置(同频切换) 一.数据配置前的硬件准备: HW-DBS3900: (1#基站名称) FAN (风扇),安装在 16#槽位: LBBP (基带处理单板),安装 ...