实现简单的web框架
实现简单的web框架
流程:
服务端启动---服务端等待请求---客户端访问---服务端响应请求
代码:
from wsgiref.simple_server import make_server #处理请求
def application(environ, start_response):
#响应头
start_response('200 OK', [('Content-Type', 'text/html')])
#响应内容
return [b'<h1>Hello, web!</h1>'] # 开始监听HTTP请求:
httpd = make_server('', 8080, application) print('Serving HTTP on port 8000...')
#永久启动服务
httpd.serve_forever()
详解:
整个application()函数本身没有涉及到任何解析HTTP的部分,也就是说,底层代码不需要我们自己编写,
我们只负责在更高层次上考虑如何响应请求就可以了。 application()函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器,我们可以挑选一个来用。 Python内置了一个WSGI服务器,这个模块叫wsgiref application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数: //environ:一个包含所有HTTP请求信息的dict对象; //start_response:一个发送HTTP响应的函数。 在application()函数中,调用: start_response('200 OK', [('Content-Type', 'text/html')]) 就发送了HTTP响应的Header,注意Header只能发送一次,也就是只能调用一次start_response()函数。
start_response()函数接收两个参数,一个是HTTP响应码,一个是一组list表示的HTTP Header,每
个Header用一个包含两个str的tuple表示。 通常情况下,都应该把Content-Type头发送给浏览器。其他很多常用的HTTP Header也应该发送。 然后,函数的返回值b'<h1>Hello, web!</h1>'将作为HTTP响应的Body发送给浏览器。 有了WSGI,我们关心的就是如何从environ这个dict对象拿到HTTP请求信息,然后构造HTML,
通过start_response()发送Header,最后返回Body。
访问

用户输入不同的url,不同的url做不同的处理
from wsgiref.simple_server import make_server def application(environ, start_response):
# 请求头
start_response('200 OK', [('Content-Type', 'text/html')])
print("path",environ['PATH_INFO'])
path=environ['PATH_INFO']
if path=="/test":
return [b'<h1>Hello, test!</h1>']
elif path=="/alex":
return [b'<h1>Hello, alex!</h1>']
else:
return [b"404"] httpd = make_server('', 8080, application) print('Serving HTTP on port 8000...')
# 开始监听HTTP请求:
httpd.serve_forever()
用户每输入一个路径,我们用一个函数去处理。 from wsgiref.simple_server import make_server def foo1():
f=open("index1.html","rb")
data=f.read()
return data def foo2():
f = open("index2.html", "rb")
data = f.read()
return data def application(environ, start_response):
# 请求头
start_response('200 OK', [('Content-Type', 'text/html')])
print("path",environ['PATH_INFO'])
path=environ['PATH_INFO']
if path=="/":
return [b"Hello Web"]
if path=="/test":
return [foo1()]
elif path=="/alex":
return [foo2()]
else:
return [b"<a>404</a>"] httpd = make_server('', 8080, application) print('Serving HTTP on port 8000...')
# 开始监听HTTP请求:
httpd.serve_forever()
使用遍历来解决 from wsgiref.simple_server import make_server def login(req):
print(req['QUERY_STRING'])
return b'welcome' def signup(req):
pass def foo1(req):
f=open("index1.html","rb")
data=f.read()
return data def foo2(req):
f = open("index2.html", "rb")
data = f.read()
return data def route():
url_patterns=[("/login",login),
("/signup",signup),
("/test",foo1),
("/alex",foo2)]
return url_patterns def application(environ, start_response):
# 请求头
start_response('200 OK', [('Content-Type', 'text/html')])
print("path",environ['PATH_INFO'])
path=environ['PATH_INFO']
#初始化
func=None
#获得url路由表
url_list=route()
#遍历
for url in url_list:
if url[0]==path:
func=url[1]
print(func)
break
#如果是路由表里的url则执行相应函数
if func:
return [func(environ)]
else:
return ["<h1>404</h1>".encode("utf8")] httpd = make_server('', 8080, application) print('Serving HTTP on port 8000...')
# 开始监听HTTP请求:
httpd.serve_forever()



实现简单的web框架的更多相关文章
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
- 一个简单的web框架实现
一个简单的web框架实现 #!/usr/bin/env python # -- coding: utf-8 -- __author__ = 'EchoRep' from wsgiref.simple_ ...
- 动手写一个简单的Web框架(模板渲染)
动手写一个简单的Web框架(模板渲染) 在百度上搜索jinja2,显示的大部分内容都是jinja2的渲染语法,这个不是Web框架需要做的事,最终,居然在Werkzeug的官方文档里找到模板渲染的代码. ...
- 动手写一个简单的Web框架(Werkzeug路由问题)
动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...
- 动手写一个简单的Web框架(HelloWorld的实现)
动手写一个简单的Web框架(HelloWorld的实现) 关于python的wsgi问题可以看这篇博客 我就不具体阐述了,简单来说,wsgi标准需要我们提供一个可以被调用的python程序,可以实函数 ...
- Python学习 - 编写一个简单的web框架(二)
在上一篇日志中已经讨论和实现了根据url执行相应应用,在我阅读了bottle.py官方文档后,按照bottle的设计重写一遍,主要借鉴大牛们的设计思想. 一个bottle.py的简单实例 来看看bot ...
- Python学习 - 编写一个简单的web框架(一)
自己动手写一个web框架,因为我是菜鸟,对于python的一些内建函数不是清楚,所以在写这篇文章之前需要一些python和WSGI的预备知识,这是一系列文章.这一篇只实现了如何处理url. 参考这篇文 ...
- 写一个简单的Web框架
在.Net中有两种常用的Web开发方式,一种是Asp.Net WebForm,另一种是Asp.Net MVC.我先简单的给大家介绍下这两种开发方式的特点,然后再应用自定义脚本映射,反射,json2te ...
- 写一个Python 1、通过select实现的最简单的web框架2、通过wsgiref实现的web框架
#!/usr/bin/env python # -*- coding: utf- -*- import socket import select class MyRequest: "&quo ...
随机推荐
- ActiveMQ消息的消费原理
消费端消费消息: 在 初识ActiveMQ 中我提到过,两种方法可以接收消息,一种是使用同步阻塞的ActiveMQMessageConsumer#receive方法.另一种是使用消息监听器Messag ...
- cf1108E2 线段树类似扫描线
/* 有点像扫描线 思路:从左到右枚举每个点,枚举到点i时,把所有以i为起点的区间的影响删去 再加上以i-1为结尾的区间的影响 */ #include<bits/stdc++.h> usi ...
- SpringMvc框架MockMvc单元测试注解及其原理分析
来源:https://www.yoodb.com/ 首先简单介绍一下Spring,它是一个轻量级开源框架,简单的来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开 ...
- .tar.xz文件的解压方法
废话不多说: 直接看 方法一: tar -xvJf ***.tar.gz 方法二: 先减压成 .tar 格式的文件, 再解压 .tar #xz是一个工具, 系统中没有安装,需要下载 xz -d *** ...
- 存储区域网络(Storage Area Network,简称SAN)
存储区域网络(Storage Area Network,简称SAN)采用网状通道(Fibre Channel ,简称FC,区别与Fiber Channel光纤通道)技术,通过FC交换机连接存储阵列和服 ...
- echarts + timeline 显示多个options
var option = { //timeline基本配置都写在baseoption 中 baseOption: { timeline: { //loop: false, axisType: 'cat ...
- .Net(C#)用正则表达式清除HTML标签(包括script和style),保留纯本文(UEdit中编写的内容上传到数据库)
去官网下载,本Demo用的MVC模式 下载地址:http://ueditor.baidu.com/website/download.html 加入文件夹中的结构: 引入了函数公式的图标: @{ Vie ...
- 为什么在球坐标系中,sinTheta2=std::max(T(0), 1 - cosTheta(w) * cosTheta(w));
球坐标系中,计算sin2θ时,采用的是如下公式,感觉不理解为什么要搞一个max函数,直接1 - cosTheta(w) * cosTheta(w)不行吗,另外,即使要用max,max的第一个参数应该是 ...
- [转] Webpack 打包优化之体积篇
谈及如今欣欣向荣的前端圈,不仅有各类框架百花齐放,如Vue, React, Angular等等,就打包工具而言,发展也是如火如荼,百家争鸣:从早期的王者Browserify, Grunt,到后来赢得宝 ...
- [BJOI2018]双人猜数游戏
题解: 彻彻底底的思维题???还是挺难的.. 首先连样例解释都没给..没看题解搞了很久 大概就是 一个人要根据另一个人的决策来猜数 可以去看洛谷那篇题解的解释 然后我们用$f[A/B][i][j][k ...