实现简单的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框架的更多相关文章

  1. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  2. 一个简单的web框架实现

    一个简单的web框架实现 #!/usr/bin/env python # -- coding: utf-8 -- __author__ = 'EchoRep' from wsgiref.simple_ ...

  3. 动手写一个简单的Web框架(模板渲染)

    动手写一个简单的Web框架(模板渲染) 在百度上搜索jinja2,显示的大部分内容都是jinja2的渲染语法,这个不是Web框架需要做的事,最终,居然在Werkzeug的官方文档里找到模板渲染的代码. ...

  4. 动手写一个简单的Web框架(Werkzeug路由问题)

    动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...

  5. 动手写一个简单的Web框架(HelloWorld的实现)

    动手写一个简单的Web框架(HelloWorld的实现) 关于python的wsgi问题可以看这篇博客 我就不具体阐述了,简单来说,wsgi标准需要我们提供一个可以被调用的python程序,可以实函数 ...

  6. Python学习 - 编写一个简单的web框架(二)

    在上一篇日志中已经讨论和实现了根据url执行相应应用,在我阅读了bottle.py官方文档后,按照bottle的设计重写一遍,主要借鉴大牛们的设计思想. 一个bottle.py的简单实例 来看看bot ...

  7. Python学习 - 编写一个简单的web框架(一)

    自己动手写一个web框架,因为我是菜鸟,对于python的一些内建函数不是清楚,所以在写这篇文章之前需要一些python和WSGI的预备知识,这是一系列文章.这一篇只实现了如何处理url. 参考这篇文 ...

  8. 写一个简单的Web框架

    在.Net中有两种常用的Web开发方式,一种是Asp.Net WebForm,另一种是Asp.Net MVC.我先简单的给大家介绍下这两种开发方式的特点,然后再应用自定义脚本映射,反射,json2te ...

  9. 写一个Python 1、通过select实现的最简单的web框架2、通过wsgiref实现的web框架

    #!/usr/bin/env python # -*- coding: utf- -*- import socket import select class MyRequest: "&quo ...

随机推荐

  1. 整合Flask中的目录结构

    一.SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from ...

  2. java----作用域

    代码块: public class Demo { public static void main(String[] args){ Test t = new Test(); Test t1 = new ...

  3. hdu1540 区间合并+询问某点的最大连续块

    询问操作需要搞一下 今天被区间合并降智了 /* D a: 摧毁第a个点 Q a:询问a所在的点的块大小 R :修复最后被破坏的点 对于所有的点需要进行一次更新 更新比较容易,tag用来表示区间是否是完 ...

  4. mysql 文件导入

    load data infile 文件路径 into table 表 fields terminated by ',' lines terminated '\n'

  5. 20165314 2016-2017-2 《Java程序设计》第9周学习总结

    20165314 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 URl类 UDP数据报 广播数据报 套接字 套接字连接机制 代码托管

  6. Python中的构造方法

    在Java等语言中都有构造方法[进行对象的创建及初始化]这个东东,示例代码如下: public class Student { //成员变量 private String name; private ...

  7. easyui实现背景图片半透明状态,悬浮在大背景之上

    首先是查找素材,使用AI将所需要的图案画出来,切记将图案的背景设置为所需要的透明状态.项目使用的是easyui架构 为啥加两个背景图呢,因为这样的布局最开始是给一个矩形框加上的背景图片,若是还使用矩形 ...

  8. C++ Primer 笔记——标准库类型string

    1.如果使用等号初始化一个变量,实际上执行的是拷贝初始化,编译器吧等号右侧的初始值拷贝到新创建的对象中去:如果不使用等号则执行的是直接初始化. std::string str = "Test ...

  9. springboot多环境(dev、test、prod)配置

    propertiest配置格式在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如: ...

  10. python—命名规范

    文件名全小写,可使用下划线 包应该是简短的.小写的名字.如果下划线可以改善可读性可以加入.如mypackage. 模块与包的规范同.如mymodule. 类总是使用首字母大写单词串.如MyClass. ...