学习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. sql查询 —— 连接查询

    -- 执行sql文件 test.sql -- 打开终端 -- cd sql文件所在路径 -- 进入mysql -- use 数据库 -- 执行 source test.sql; -- 自关联 -- 一 ...

  2. adb 无线连接手机设备

    连接语法: $ adb connect ip:port 断开连接: $ adb disconnect ip:port 可能遇到问题:unable to connect to 192.168.199.2 ...

  3. MFC对话框常用操作文章收藏

    1.改变控件文本 参考链接:https://blog.csdn.net/active2489595970/article/details/88856235 所有控件的文本都可以用这种方式动态改变. 2 ...

  4. SpringBoot中的bean加载顺序

    https://www.dazhuanlan.com/2019/10/22/5daebc5d16429/ 最近在做传统Spring项目到SpringBoot项目迁移过程中,遇到了一些bean加载顺序的 ...

  5. RemoteViews 整理

    前言 RemoteViews表面意思就是远程的view,这个就很难理解了,远程的view.但是英语是抽象,remote本身就是偏僻的,偏远的意思. 所以remoteViews 就是地方view,天高皇 ...

  6. Echarts使用一个图例legend实现全选和全部取消的功能

    1.修改legend的data值,在前面加上全选和全不选,data = ['全选','全不选',1,2,3] 2.监听 legendselectchanged事件 / 使用刚指定的配置项和数据显示图表 ...

  7. 两个map合并

    两个map合并所用函数为:putAll package myProject; import java.util.HashMap; import java.util.Map; public class ...

  8. DVWA全级别之File Upload(文件上传)

    File Upload File Upload,即文件上传漏洞,通常是由于对上传文件的类型.内容没有进行严格的过滤.检查,使得攻击者可以通过上传木马获取服务器的webshell权限,因此文件上传漏洞带 ...

  9. JS 每次进入自动加载JS

    对于动态文件,比如 index.asp?id=... 或者 index.aspx?id=... 相信有经验的程序员都知道怎样禁止浏览器缓存数据了.但是对于静态文件(css,jpg,gif等等), 在什 ...

  10. LVM逻辑卷:创建LVM分区实例

    一.概述 LVM(Logical Volume Manager)是基于内核的一种逻辑卷管理器,LVM适合于管理大存储设备,并允许用户动态调整文件系统的大小.此外LVM快照功能可以帮助我们快速备份数据. ...