学习django框架之前,可以先学习一下wsgiref模块,熟悉前后端交互。

一.先介绍下wsgiref模块

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

通俗的说:当规范建立后,程序就不再重复编写web server(socket服务端),而是直接使用现成的实现WSGI的模块(例如:wsgiref、uwsgi、werkzeug),从而让程序员更加专注与业务代码

与其重复造轮子,不如直接用现成的。

Python的wsgiref是基于WSGI规范封装的模块,我们可以在这个模块基础上开发我们的web server。

接下来我们引用wsgiref来编写一个web服务器

#_author:leo gao
#encoding:utf-8 from wsgiref.simple_server import make_server def run_server(environ, start_response):
"""
当有用户在浏览器上访问:http://127.0.0.1:8000/, 立即执行该函数并将函数的返回值返回给用户浏览器
:param environ: 请求相关内容,比如浏览器类型、版本、来源地址、url等
:param start_response: 响应相关
:return:
""" start_response('200 OK', [('Content-Type', 'text/html;charset=utf-8')]) return [bytes('hhhh', encoding="utf-8"), ] if __name__ == '__main__': httpd = make_server('localhost', 8001, run_server) # socket连接
print('----已连接至8001----')
httpd.serve_forever() # 持续监听

前端访问效果为:

接下来有个需求如果我想要通过输入不同的路径去访问不同的页面怎么实现呢?

在environ中有一个字段:"PATH_INFO",这个键对应的值就是输入的路径

#_author:leo gao
#encoding:utf-8 from wsgiref.simple_server import make_server def run_server(environ, start_response):
"""
当有用户在浏览器上访问:http://127.0.0.1:8000/, 立即执行该函数并将函数的返回值返回给用户浏览器
:param environ: 请求相关内容,比如浏览器类型、版本、来源地址、url等
:param start_response: 响应相关
:return:
""" start_response('200 OK', [('Content-Type', 'text/html;charset=utf-8')]) if environ['PATH_INFO'] == '/login':
with open('login.html', 'rb') as f:
data = f.read()
return [data] if environ['PATH_INFO'] == '/favicon.ico':
with open('favicon.ico', 'rb') as f :
data = f.read()
return [data] elif environ['PATH_INFO'] == '/index':
with open('index.html', 'rb') as f:
data = f.read()
return [data] if __name__ == '__main__': httpd = make_server('localhost', 8030, run_server) # socket连接
print('----已连接至8001----')
httpd.serve_forever() # 持续监听

前端访问效果为:

功能是实现了,但是如果需要跳转的页面很多,全放在run_server中会不会显得很累赘?这样我们把跳转各个页面的逻辑封装成各个方法。

#_author:leo gao
#encoding:utf-8 from wsgiref.simple_server import make_server def login():
with open('login.html', 'r') as f:
data = f.read()
return data def index():
with open('index.html', 'r') as f:
data = f.read()
return data def fav():
with open('favicon.ico', 'r') as f:
data = f.read()
return data def run_server(environ, start_response):
"""
当有用户在浏览器上访问:http://127.0.0.1:8000/, 立即执行该函数并将函数的返回值返回给用户浏览器
:param environ: 请求相关内容,比如浏览器类型、版本、来源地址、url等
:param start_response: 响应相关
:return:
""" url_pattern = [
("/login", login),
("/index", index),
("fav", fav)
] # 方案一
for i in url_pattern:
print(environ.get('PATH_INFO'))
if i[0] == environ.get('PATH_INFO'):
return [bytes(i[1](), encoding='utf-8'), ]
else:
return [b''] # 方案二
func = None
for item in url_pattern:
if item[0] == environ.get('PATH_INFO'):
func = item[1]
break
if func:
return [bytes(func(), encoding="utf-8"), ]
else:
return [bytes('404 not found.', encoding="utf-8"), ] if __name__ == '__main__': httpd = make_server('localhost', 8040, run_server) # socket连接
print('----已连接至8001----')
httpd.serve_forever() # 持续监听

前端访问效果为:

请尊重作者劳动成果,有需要请转载,标明出处!!!

wsgiref模块的更多相关文章

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

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

  2. django系列1--介绍与简单原理, wsgiref模块

    一.web应用框架 Web应用框架(Web application framework)是一种计算机软件框架,用来支持动态网站.网络应用程序及网络服务的开发.这种框架有助于减轻网页开发时共通性活动的工 ...

  3. 003---wsgi和wsgiref模块

    WSGI: 全称:Web Server Gatway Interface ,web服务网关接口,独立的,与django无关,他们俩只是遵循一个约定,是一个协议. wsgiref模块: 实现了WSGI协 ...

  4. wsgiref模块、web框架、django框架简介

    """web框架:将前端.数据库整合到一起的基于互联网传输的python代码 web框架也可以简单的理解为是软件开发架构里面的'服务端'""" ...

  5. wsgiref模块,动静态网页,jinja2模块,django

    基于wsgiref模块搭建服务端 from wsgiref import simple_server def run(request, response): """ :p ...

  6. Python--day60--web框架分类和wsgiref模块使用介绍

  7. Django(wsgiref、jinja2模块使用介绍)

    day60 wsgiref比较稳定 """ 根据URL中不同的路径返回不同的内容--函数进阶版 返回HTML页面 让网页动态起来 wsgiref模块版 "&qu ...

  8. Django框架简介,wsgiref 与 jinja2 模块

    目录 框架简介 wsgiref模块 jinja2 模块 框架简介 Django是一个web开发框架,用来开发web应用,本质就是, web框架+socket服务端 MVC框架和MTV框架 MVC,全名 ...

  9. 09 基于模块wsgiref版web框架

    09 基于模块wsgiref版web框架 模块引入 真实开发中的python web程序,一般会分为两部分:       服务器程序:负责对socket服务器进行封装,并在请求到来时,对请求的各种数据 ...

随机推荐

  1. Vue中import '@...'的意思

    转载: https://blog.csdn.net/xiazeqiang2018/article/details/81325996 写项目的时候看到很多导入都是@开头,这是webpack的路径别名,相 ...

  2. 同步选中所有checkbox

    $("input[type=checkbox][tag=ckAll]").change(function () $(this).parent().parent().siblings ...

  3. Jquery拖拽,拖动排序插件

    上github搜jquery-sortable <!-- jq拖拽排序 --> <script src="${contextPath}/static/excelTable/ ...

  4. 这里有一份热乎乎的git相关操作

    文件操作 git init (添加文件): git status (查看文件状态): git diff (查看修改内容): git rm (删除文件): git add (把文件保存在暂存区): gi ...

  5. 10day 字符集优化 重点

    什么是字符编码: 可以实现对非英文字符的支持 计算机操作系统是谁发明的? --美国人--英语 支持中文比较好的编码: UTF-8 比较通用 GBK 比较国际通用 出现乱码的原因: 01. 系统字符集设 ...

  6. 文件上传plupload组件使用

    这段时间一直在使用文件上传,简要的介绍一下文件上传的组件使用,先上一段代码. var uploader = new plupload.Uploader( { //用来指定上传方式,指定多个上传方式请使 ...

  7. 为什么CSS,JS以及图片等这些资源的路径需要加问号

    我们平时练习的时候,很少写路径上面需要加问号的,而实际应用当中,我们经常看到一些资源的路径后面跟着问号,这是为什么呢? 答:答案很简单哦,其实就是为了防止缓存,我们可以在原本路径的后面加上问号,加上我 ...

  8. CentOS根目录下各目录介绍

    bin :存放普通用户可执行的指令,即使在单用户模式下也能够执行处理 boot :开机引导目录,包括Linux内核文件与开机所需要的文件 dev :设备目录,所有的硬件设备及周边均放置在这个设备目录中 ...

  9. Bootstrap入门(1)简介

    作者:赵盼盼 出处:https://www.cnblogs.com/zhaopanpan/ Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快 ...

  10. Lenet 神经网络-实现篇(1)

    Lenet 神经网络结构为: ①输入为 32*32*1 的图片大小,为单通道的输入: ②进行卷积,卷积核大小为 5*5*1,个数为 6,步长为 1,非全零填充模式: ③将卷积结果通过非线性激活函数: ...