不到100行写出一个完整的web框架

网友投稿 643 2022-10-11

不到100行写出一个完整的web框架

不到100行写出一个完整的web框架

本篇文章是为了后面的Django做准备的,这是学习web框架的底层知识,没有直接用到socket,而是用Python自带的库wsgiref。1、wsgiref模块 它就相当于是一个服务器,会帮我们做解析,内部已经封装好了socket等多项功能。

2、框架主要分为五部分1)导入模块

from wsgiref.simple_server import

2)自定义处理函数

def foo1(req): f=open("index1.html","rb") # 读取文件 data=f.read() return

3)路由分发函数 即分发其他函数的一个函数,所有的要实现的功能都可以放在这里面传输到服务器,这样每一个路径都可以对应一个函数。

def router(): url_patterns=[ ("/login",login), ("/register",register), ("/Viewin", foo1), ("/Zoro", foo2), ("/show_time",show_time), ] return

4)应用函数 框架本体,可以直接套用。一但有端口连接进入后,就会运行application函数,environ是wsgiref服务器处理传入的请求信息,是一个大字典,取值用键值对来取。

def application(environ, start_response): # 在application函数内,则需要作出响应操作 #通过environ来取路径上输入的值 print("path",environ["PATH_INFO"]) path= environ["PATH_INFO"] # start_response设置响应头:状态码为200,状态码解析是OK,文本内容,文本格式... start_response('200 OK', [('Content-Type', 'text/html')]) # return返回响应体 return [b"

Hello, web!

"]

5)创建链接并监听HTTP请求 参数:IP地址,端口,应用函数 注意:这里的IP地址会默认获取本机的IP地址

# 创建链接= make_server('', 8080, application)# 开始监听HTTP请求:1)show_time

时间:{{time}}

2)login

用户:

密码:

提交

3)index1

Hello ViewIn!

4)index2

Hello Zoro!

4、参考效果

5、完整web框架

# 导入wsgiref模块(不会直接使用socket),# 它相当于是一个服务器,会帮我们做解析,内部已经封装好了socket等多项功能from wsgiref.simple_server import make_serverimport time# 自定义处理函数def foo1(req): f=open("index1.html","rb") # 读取文件 data=f.read() return datadef foo2(req): f = open("index2.html", "rb") # 读取文件 data = f.read() return datadef login(req): # print(req) #找到user和pwd所在的大的键为QUERY_STRING print(req["QUERY_STRING"]) return b"Welcome to my web!"def register(req): passdef show_time(req): times=time.ctime() # 获取时间的字符串 f= open("show_time.html","rb") data= f.read().decode("utf8") # 自定义语法{{}},来找到我们需要的时间 # 用变量times(准确的时间)去替换页面内的time data= data.replace("{{time}}",str(times)) # 此处替换后的内容是字符串,因此需要转码一下 return data.encode("utf8")# 路由分发的函数:即分发其他函数的一个函数,所有的要实现的功能都可以放在这里面传输到服务器# 这样每一个路径都可以对应一个函数def router(): url_patterns=[ ("/login",login), ("/register",register), ("/Viewin", foo1), ("/Zoro", foo2), ("/show_time",show_time), ] return url_patterns# 应用函数:一但有端口连接进入后,就会运行application函数# environ是wsgiref服务器处理传入的请求信息,是一个大字典,取值用键值对来取def application(environ, start_response): # 在application函数内,则需要作出响应操作 #通过environ来取路径上输入的值 print("path",environ["PATH_INFO"]) path= environ["PATH_INFO"] # start_response设置响应头:状态码为200,状态码解析是OK,文本内容,文本格式... start_response('200 OK', [('Content-Type', 'text/html')]) ''' if path=="/Viewin": return[foo1()] # return[b"

Hello ViewIn!

"] # 传入网页的应该是字节类型(二进制),并且最终应该包含在一个大字典里 elif path=="/Zoro": return[foo2()] # return[b"

Hello Zoro!

"] ''' # 接收路由分发函数 url_patterns=router() func=None # 用来装中间函数的 # 遍历路由分发里的函数 for item in url_patterns: # 如果遍历的对象和路径输入一致,则执行这个路径对应的函数 if item[0]==path: func=item[1] break # 因为默认的None,所以需要判断一下是否为空 if func: return[func(environ)] # 执行中间函数,并将路径上获取的信息作为参数传入 else: return [b"

404

"] # return返回响应体 return [b"

Hello, web!

"]# 参数:IP地址,端口,应用函数# 注意:这里的IP地址会默认获取本机的IP地址= make_server('', 8080, application)print('Serving HTTP on port 8080...')# 开始监听HTTP请求:httpd.serve_forever()

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:模电之半导体基础篇1(本征半导体、杂质半导体)
下一篇:SpringBoot 集成短信和邮件的配置示例详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~