09 基于模块wsgiref版web框架
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框架的更多相关文章
- koa : Express出品的下一代基于Node.js的web框架
https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434501579966a ...
- 02 初级版web框架
02 初级版web框架 服务器server端python程序(初级版): import socket server=socket.socket() server.bind(("127.0.0 ...
- 01 基础版web框架
01 基础版web框架 服务器server端python程序(基础版): import socket server=socket.socket() server.bind(("127.0.0 ...
- 2、基于wsgiref模块DIY一个web框架
一 web框架 Web框架(Web framework)是一种开发框架,用来支持动态网站.网络应用和网络服务的开发.这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方 ...
- 搭建简易的WebServer(基于pyhton实现简易Web框架 使用socket套接字)
1. 使用web底层socket的方式实现简易服务器的搭建,用来理解学习 # 1.导入socket模块 import socket import re import gevent import sys ...
- 基于servlet实现一个web框架
servlet作为一个web规范.其本身就算做一个web开发框架,可是其web action (响应某个URI的实现)的实现都是基于类的,不是非常方便,而且3.0之前的版本号还必须通过web.xml配 ...
- 自定义mvc或mtv框架:基于wsgiref的web框架
把mvc或mtv框架的model数据库,view:html,control逻辑处理,url判别,wsgiref集中在一个文件 代码如下 #!/usr/bin/env python #-*- codin ...
- cowboy-高性能简洁的erlang版web框架
那么Cowboy是什么呢? Cowboy is a small, fast and modular HTTP server written in Erlang. 其定位非常明确: Cowboy aim ...
- 基于node.js的web框架express
1.安装node.js方法: window :https://nodejs.org/en/ linux:http://www.runoob.com/nodejs/nodejs-install-setu ...
随机推荐
- php最快捷的插入数据,3000万仅需5秒
<?phpheader('content-type:text/html;charset=utf-8');//采集数据$url="http://www.keepclub.com/club ...
- iscsi的工作原理与优化(2)
2.1 iSCSI协议模型,iscsi[会话层协议,即应用协议] iSCSI使用TCP/IP协议在不稳定网络上进行可靠的数据传输.iSCSI层和标准SCSI集在协议栈中的位置如图1所示.iSCSI层包 ...
- 获取 ProgramData 之类的环境变量(文件夹路径)的值
GetEnvironmentVariable Recognized Environment Variables https://docs.microsoft.com/en-us/windows/dep ...
- POJ1475 推箱子---模块化思想
自古逢秋悲寂寥,我言秋日胜春朝. 晴空一鹤排云上,便引诗情到碧霄. --刘禹锡 题目:推箱子 网址:http://poj.org/problem?id=1475 推箱子游戏相信大家都不陌生,在本题中, ...
- Spring Boot JPA 中transaction的使用
文章目录 @Transactional的实现 @Transactional的使用 Transaction的传播级别 REQUIRED SUPPORTS MANDATORY NEVER NOT_SUPP ...
- hdu_1050 Moving Tables 贪心
Moving Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- 【shell】shell脚本入门
1. 前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,Linux/UNIX系统的底层及基础应用软件的核心大部分涉及Shell脚 ...
- includes与indexOf
indexOf(a,b)是在es6之前常用的判断数组/字符串内元素是否存在的api,接收两个参数,第一个a代表要被查找的元素,必填.第二个代表从数组的某个坐标开始查找,可选 在数组中 通过indexO ...
- swift 3.0字符串的简单使用
let str:String = "12314124" 获取某个指定位置的元素 print(str.characters[str.index(str.startIndex, off ...
- JeeSite 4.0 简化业务逻辑层开发
2019独角兽企业重金招聘Python工程师标准>>> 引言 对于业务逻辑层的开发重复代码很多,尽管有代码生成器,但从代码量总的来说还是比较多,所以就有了以下抽象类及工具,对一些常用 ...