学习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. jQuery实现TAB选项卡切换特效简单演示

    本文实例为大家分享jQuery实现TAB选项卡切换特效,供大家参考,具体内容如下 1.tab切换 on ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 ...

  2. gradle-技能保存

    gradle编译java springboot,指定使用哪个环境配置文件 首先在build.gradle里面声明一个变量 def profileName = project.hasProperty(& ...

  3. dea创建Maven工程用c3p0连接数据库报错java.sql.SQLException: Connections could not be acquired from the underlying

    idea   java.sql.SQLException: Connections could not be acquired from the underlying database! 转载自:ht ...

  4. Ehab and a Special Coloring Problem

    You're given an integer nn. For every integer ii from 22 to nn, assign a positive integer aiai such ...

  5. [AGC027C]ABland Yard

    Description AGC027C 给定一张图,点有标号A或B,计算是否对于任意的一个由AB构成的字符串都在图中有对应的路径. Solution 观察可以发现,如果有个环(不一定是简单环)是AAB ...

  6. Eqaulize Prices

    There are n products in the shop. The price of the ii-th product is aiai. The owner of the shop want ...

  7. 【转载】Windows环境下JNI的实现实例

    转自:http://blog.csdn.net/jjunjoe/article/details/6987183 一.关于JNI: JNI(Java Native Interface):Java本地调用 ...

  8. Nginx之server和location配置使用

    配置server代码段: server { server_name www.meiduo.site; listen ; root /home/python/Desktop/meiduo_mall_ad ...

  9. SqlDataAdapter对象

    https://blog.csdn.net/qq_39657909/article/details/80615465 一.特点介绍 1.表示用于填充 DataSet 和更新 SQL Server 数据 ...

  10. ACM-ICPC实验室20.2.21测试-图论(二)

    A.患者的编号 给出一个有向图,要求你输出字典序最小的拓扑排序. 常规拓扑排序是做不了的,正解是反向建图,同时用大根堆的优先队列维护,保证每次优先访问编号大的结点,再反向输出~ #include< ...