实现简单的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 ...
随机推荐
- Windows服务启动进程----Cjwdev.WindowsApi.dll
windows服务下无法启动外部程序 做一个windows服务监听服务,涉及到windows服务启动外部程序的一个过程,但是调试测试发现,无法简单的用process.start()这种方法, 原因是在 ...
- 用D3.js画的人物关系demo
代码下载地址:https://github.com/zhangzn3/group-explorer ### Demo1功能 *** * 支持节点拖拽 * 支持节点拖拽并固定位置 * 支持鼠标浮到节点显 ...
- 常见的排序算法(直接插入&选择排序&二分查找排序)
1.直接插入排序算法 源码: package com.DiYiZhang;/* 插入排序算法 * 如下进行的是插入,排序算法*/ public class InsertionSort { pub ...
- 关于JDBC的总结
1. Spring JDBC子框架是什么 答:就是一个Spring框架内置的持久层框架.既然是一个持久层框架,作用就是对数据库增删改查!! 2. SpringJDBC是使用声明类操作数据库的? 答:J ...
- cf1076d 贪心最短路
#include<bits/stdc++.h> #include<queue> using namespace std; #define maxn 300005 #define ...
- Just oj 2018 C语言程序设计竞赛(高级组)H: CBT?
H: CBT? 时间限制: 1 s 内存限制: 128 MB 提交 我的状态 题目描述 对于二叉树,如果这棵树的节点排布是按行从上到下,每行从左到右挨个放置,中间不会有空闲的节点. ...
- XAML绑定到资源文件字符串时失败
参考:https://stackoverflow.com/questions/19586401/error-in-binding-resource-string-with-a-view-in-wpf ...
- vi/vim键盘对应图
来源:http://www.runoob.com/linux/linux-vim.html
- jQuery实用工具集
插件描述:jQuery实用工具集,该插件封装了常用功能,如序列化表单值获取地址栏参数window对象操作等 此工具集包含判断浏览器,判断浏览终端,获取地址栏参数,获取随机数,数据校验等常用操作功能 引 ...
- lua和java防注入
lua样例 local sql = "SELECT * FROM t_base_person WHERE person_id=%s and bureau_id=%s" sql = ...