mini web框架示例

news2024/11/26 13:36:57

web框架:

使用web框架专门负责处理用户的动态资源请求,这个web框架其实就是一个为web服务器提供服务的应用程序

什么是路由?

路由就是请求的url到处理函数的映射,也就是说提前把请求的URL和处理函数关联好

管理路由可以使用一个路由列表进行管理

web.py文件:


		importsocket
		importos
		importthreading
		importsys
		importframework
		
		
		#http协议的web服务器类
		classHttpWebServer(object):
		def__init__(self,port):
		#创建tcp服务端套接字
		tcp_server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
		#设置端口号复用,程序退出端口号立即释放
		tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
		#绑定端口号
		tcp_server_socket.bind(("",port))
		#设置监听
		tcp_server_socket.listen(128)
		#把tcp服务器的套接字作为web服务器对象的属性
		self.tcp_server_socket=tcp_server_socket
		
		#处理客户端请求
		@staticmethod
		defhandle_client_request(new_socket):
		#接收客户端的请求信息
		recv_data=new_socket.recv(4096)
		#判断接收的数据长度是否为0
		iflen(recv_data)==0:
		new_socket.close()
		return
		
		#对二进制数据进行解码
		recv_content=recv_data.decode("utf-8")
		print(recv_content)
		
		#对数据按照空格进行分割
		request_list=recv_content.split("",maxsplit=2)
		#获取请求的资源路径
		request_path=request_list[1]
		print(request_path)
		
		#判断请求的是否是根目录,如果是根目录设置返回的信息
		ifrequest_path=="/":
		request_path="/index.html"
		
		#判断是否是动态资源请求,以后把后缀是.html的请求任务是动态资源请求
		ifrequest_path.endswith(".html"):
		"""动态资源请求"""
		#动态资源请求找web框架进行处理,需要把请求参数给web框架
		#准备给web框架的参数信息,都要放到字典里面
		env={
		"request_path":request_path,
		#传入请求头信息,额外的参数可以在字典里面在进行添加
		}
		#使用框架处理动态资源请求,
		#1.web框架需要把处理结果返回给web服务器,
		#2.web服务器负责把返回的结果封装成响应报文发送给浏览器
		status,headers,response_body=framework.handle_request(env)
		print(status,headers,response_body)
		#响应行
		response_line="HTTP/1.1%s\r\n"%status
		#响应头
		response_header=""
		forheaderinheaders:
		response_header+="%s:%s\r\n"%header
		
		#响应报文
		response_data=(response_line+
		response_header+
		"\r\n"+
		response_body).encode("utf-8")
		
		#发送响应报文数据给浏览器
		new_socket.send(response_data)
		#关闭连接
		new_socket.close()
		
		else:
		"""静态资源请求"""
		#1.os.path.exits
		#os.path.exists("static/"+request_path)
		#2.try-except
		
		try:
		#打开文件读取文件中的数据,提示:这里使用rb模式,兼容打开图片文件
		withopen("static"+request_path,"rb")asfile:#这里的file表示打开文件的对象
		file_data=file.read()
		#提示:withopen关闭文件这步操作不用程序员来完成,系统帮我们来完成
		exceptExceptionase:
		#代码执行到此,说明没有请求的该文件,返回404状态信息
		#响应行
		response_line="HTTP/1.1404NotFound\r\n"
		#响应头
		response_header="Server:PWS/1.0\r\n"
		#读取404页面数据
		withopen("static/error.html","rb")asfile:
		file_data=file.read()
		
		#响应体
		response_body=file_data
		
		#把数据封装成http响应报文格式的数据
		response=(response_line+
		response_header+
		"\r\n").encode("utf-8")+response_body
		
		#发送给浏览器的响应报文数据
		new_socket.send(response)
		
		else:
		#代码执行到此,说明文件存在,返回200状态信息
		#响应行
		response_line="HTTP/1.1200OK\r\n"
		#响应头
		response_header="Server:PWS/1.0\r\n"
		#响应体
		response_body=file_data
		
		#把数据封装成http响应报文格式的数据
		response=(response_line+
		response_header+
		"\r\n").encode("utf-8")+response_body
		
		#发送给浏览器的响应报文数据
		new_socket.send(response)
		finally:
		#关闭服务于客户端的套接字
		new_socket.close()
		
		#启动服务器的方法
		defstart(self):
		#循环等待接受客户端的连接请求
		whileTrue:
		#等待接受客户端的连接请求
		new_socket,ip_port=self.tcp_server_socket.accept()
		#代码执行到此,说明连接建立成功
		sub_thread=threading.Thread(target=self.handle_client_request,args=(new_socket,))
		#设置成为守护主线程
		sub_thread.setDaemon(True)
		#启动子线程执行对应的任务
		sub_thread.start()
		
		
		defmain():
		
		##获取终端命令行参数
		#params=sys.argv
		#iflen(params)!=2:
		#print("执行的命令格式如下:python3xxx.py9000")
		#return
		##
		###判断第二个参数是否都是由数字组成的字符串
		#ifnotparams[1].isdigit():
		#print("执行的命令格式如下:python3xxx.py9000")
		#return
		##
		###代码执行到此,说明命令行参数的个数一定2个并且第二个参数是由数字组成的字符串
		#port=int(params[1])
		#创建web服务器
		web_server=HttpWebServer(8000)
		#启动服务器
		web_server.start()
		
		#判断是否是主模块的代码
		if__name__=='__main__':
		main()
	framework.py文件:
		"""web框架的职责专门负责处理动态资源请求"""
		importtime
		route_list=[
		
		]
		#定义带有参数的装饰器
		defroute(path):
		defdecorator(func):
		#装饰器执行的时候就需要把路由添加到路由列表里
		route_list.append((path,func))
		definner():
		result=func();
		returnresult
		returninner
		returndecorator
		
		#获取首页数据
		@route("/index.html")
		defindex():
		#状态信息
		status="200OK"
		#响应头信息
		response_header=[("Server","PWS/1.1")]
		#1.打开指定模板文件,读取模板文件中的数据
		withopen("template/index.html","r",encoding='utf-8')asfile:
		file_data=file.read()
		#2.查询数据库,模板里面的模板变量替换成以后从数据库里查询的数据
		
		#web框架处理后的数据
		#获取当前时间,模拟数据库内容
		data=time.ctime()
		response_body=file_data.replace("{%content%}",data)
		#这里返回的是元组
		returnstatus,response_header,response_body
		
		#获取个人中心数据
		@route("/center.html")
		defcenter():
		#状态信息
		status="200OK"
		#响应头信息
		response_header=[("Server","PWS/1.1")]
		#1.打开指定模板文件,读取模板文件中的数据
		withopen("template/center.html","r",encoding='utf-8')asfile:
		file_data=file.read()
		#2.查询数据库,模板里面的模板变量替换成以后从数据库里查询的数据
		
		#web框架处理后的数据
		#获取当前时间,模拟数据库内容
		data=time.ctime()
		response_body=file_data.replace("{%content%}",data)
		#这里返回的是元组
		returnstatus,response_header,response_body
		
		#处理没有找到的动态资源
		defnot_found():
		#状态信息
		status="404NotFound"
		#响应头信息
		response_header=[("Server","PWS/1.1")]
		#web框架处理后的数据
		data="notfound"
		
		#这里返回的是元组
		returnstatus,response_header,data
		
		#处理动态资源请求
		defhandle_request(env):
		#获取动态的请求资源路径
		request_path=env["request_path"]
		print("动态资源请求的地址:",request_path)
		#判断请求的动态资源路径,选择指定的函数处理对应的动态资源请求
		forpath,funcinroute_list:
		ifrequest_path==path:
		result=func()
		returnresult
		else:
		result=not_found()
		returnresult
		
		
		#ifrequest_path=="/index.html":
		##获取首页数据
		#result=index()
		##把处理后的结果返回给web服务器使用,让web服务器拼接响应报文时使用
		#returnresult
		#elifrequest_path=="/center.html":
		##个人中心
		#result=center()
		#returnresult
		#else:
		##没有动态资源数据,返回404状态信息
		#result=not_found()
		##把处理后的结果返回给web服务器使用,让web服务器拼接响应报文时使用
		#returnresult
		if__name__=="__main__":
		print(route_list)
		
		
		
		

framework.py文件:

"""web框架的职责专门负责处理动态资源请求"""
import time
route_list=[

]
#定义带有参数的装饰器
def route(path):
    def decorator(func):
        #装饰器执行的时候就需要把路由添加到路由列表里
        route_list.append((path, func))
        def inner():
            result=func();
            return result
        return inner
    return decorator

# 获取首页数据
@route("/index.html")
def index():
    # 状态信息
    status = "200 OK"
    # 响应头信息
    response_header = [("Server", "PWS/1.1")]
    # 1.打开指定模板文件,读取模板文件中的数据
    with open("template/index.html","r",encoding='utf-8') as file:
         file_data=file.read()
    # 2.查询数据库,模板里面的模板变量替换成以后从数据库里查询的数据

    # web框架处理后的数据
    # 获取当前时间,模拟数据库内容
    data = time.ctime()
    response_body=file_data.replace("{%content%}",data)
    # 这里返回的是元组
    return status, response_header, response_body

#获取个人中心数据
@route("/center.html")
def center():
    # 状态信息
    status = "200 OK"
    # 响应头信息
    response_header = [("Server", "PWS/1.1")]
    # 1.打开指定模板文件,读取模板文件中的数据
    with open("template/center.html","r",encoding='utf-8') as file:
         file_data=file.read()
    # 2.查询数据库,模板里面的模板变量替换成以后从数据库里查询的数据

    # web框架处理后的数据
    # 获取当前时间,模拟数据库内容
    data = time.ctime()
    response_body=file_data.replace("{%content%}",data)
    # 这里返回的是元组
    return status, response_header, response_body

# 处理没有找到的动态资源
def not_found():
    # 状态信息
    status = "404 Not Found"
    # 响应头信息
    response_header = [("Server", "PWS/1.1")]
    # web框架处理后的数据
    data = "not found"

    # 这里返回的是元组
    return status, response_header, data

# 处理动态资源请求
def handle_request(env):
    # 获取动态的请求资源路径
    request_path = env["request_path"]
    print("动态资源请求的地址:", request_path)
    # 判断请求的动态资源路径,选择指定的函数处理对应的动态资源请求
    for path, func in route_list:
        if request_path == path:
            result = func()
            return result
    else:
        result = not_found()
        return result


    # if request_path == "/index.html":
    #     # 获取首页数据
    #     result = index()
    #     # 把处理后的结果返回给web服务器使用,让web服务器拼接响应报文时使用
    #     return result
    # elif request_path=="/center.html":
    #    #个人中心
    #     result=center()
    #     return result
    # else:
    #     # 没有动态资源数据, 返回404状态信息
    #     result = not_found()
    #     # 把处理后的结果返回给web服务器使用,让web服务器拼接响应报文时使用
    #     return result
if __name__=="__main__":
    print(route_list)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1826085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 中 Varchar(50) 和 varchar(500) 区别是什么?

一. 问题描述 我们在设计表结构的时候,设计规范里面有一条如下规则: 对于可变长度的字段,在满足条件的前提下,尽可能使用较短的变长字段长度。 为什么这么规定?我在网上查了一下,主要基于两个方面 基于存储空间的考…

Springboot实现微信小程序登录功能

目录 一 什么是微信登录功能 二 实现微信登录功能的整体逻辑 三 微信登录功能实现步骤 一 什么是微信登录功能 微信小程序登录功能一般用于开发微信小程序的时候,我们需要使用微信授权登录我们的微信小程序,本篇博客就微信小程序实现微信授权登录以及s…

Javaweb8 数据库Mybatis+JDBC

Mybatis Dao层,用于简化JDBC开发 1步中的实体类 int类型一般用Integer :如果用int类型 默认值为0,会影响数据的判断,用Integer默认值是null,不会给数据的判断造成干扰 2.在application .properties里配置数据库的链接信息-四要素 #驱动类名称 #URL #用…

stm32f103 HAL库 HC-SR04测距

目录 一、实现测距二、添加TIM3控制LED根据距离以不同频率闪烁三、观察时序Modebus协议12路超声波雷达设计方案1. 系统架构设计2. 硬件设计3. 软件设计4. 通信协议设计5. 用户接口6. 安全和冗余7. 测试和验证8. 电源和物理封装9. 文档和支持 一、实现测距 配置时钟 配置定时器…

0-1 构建用户画像数仓

目录 前言 一、用户画像概述 1.1 用户画像 1.2 用户标签 1.3 用户群组 二、建设标签和标签体系 2.1 标签体系 2.1.1 统计类标签 2.1.2 规则类标签 2.1.3 机器学习挖掘类标签 2.2 标签建设流程 2.2.1 需求收集与分析 2.2.2 产出标签需求文档 2.2.3 标签的开发 H…

docker安装消息队列mq中的rabbit服务

在现代化的分布式系统中,消息队列(Message Queue, MQ)已经成为了一种不可或缺的组件。RabbitMQ作为一款高性能、开源的消息队列软件,因其高可用性、可扩展性和易用性而广受欢迎。本文将详细介绍如何在Docker环境中安装RabbitMQ服务…

04-appium元素定位

一、uiautomatorviewer uiautomatorviewer是Android-SDK自带的一个元素定位工具,非常简单好用,可以使用该工具查看app应用中的元素属性,帮助我们在代码中进行元素定位。 1)使用步骤 在Android-SDK安装目录中进入到 android-sdk-…

【TB作品】STM32F102C8T6单片机,PWM发生器

硬件: STM32F102C8T6核心板,按键,0.96 OLED显示屏。 软件: 1、硬件启动触发单片机输出PWM,未触发之前PWM输出为低电平。 2、按键修改PWM的变化模式、变化时间长度、占空比上下限。 3、输出的PWM是固定的10kHZ的。 4、变…

Redis的安装(linux、docker)与其基本的api使用

一、Redis简介 Redis是一个开源的,使用 C 编写,高性能的Key-Value的NoSQL数据库。 SQL :关系型数据库,例如:MySQL,Oracle等等NoSQL :Not Only SQL 不仅仅是SQL,表示是非关系型数据库…

【漏洞复现】东胜物流软件 GetProParentModuTreeList SQL注入漏洞

0x01 产品简介 东胜物流软件是青岛东胜伟业软件有限公司-款集订单管理、仓库管理、运输管理等多种功能于一体的物流管理软件。该公司初创于2004年11月(前身为青岛景宏物流信息技术有限公司),专注于航运物流相关环节的产品和服务。东胜物流信息管理系统货代版采用MS…

Canvas绘制老友记时钟

Canvas绘制老友记时钟 前言 一直做3D/2D可视化&#xff0c;Canvas API和三角函数&#xff0c;空间几何是基础。在官网上看了一遍Canvas API之后&#xff0c;决定绘制一个老友记时钟来巩固知识点&#xff0c;本文用实际代码讲解绘制过程。 代码 HTML <canvas id"myC…

C++ 30 之 new 和 delete 关键字

#include <iostream> #include <string.h> using namespace std;class Students08{ public:Students08(){cout << "students08的默认构造函数"<< endl;}Students08(int a){cout << "students08的有参构造函数"<< endl…

永磁同步直线电机(PMLSM)控制与仿真1-永磁同步直线电机数学模型

文章目录 1、引言2、永磁同步直线电机数学模型2.1 直线电机的结构和工作原理2.2 永磁同步直线电机系统干扰分析2.2.1 齿槽效应2.2.2 端部效应 2.3 永磁同步直线电机的结构2.4 永磁同步直线电机的数学模型2.4.1 ABC坐标系下 PMLSM 的数学模型2.4.2 dq坐标系下 PMLSM 的数学模型2…

集成学习 Ensemble Learning

目录 一、集成学习概览1、介绍2、学习器3、boosting和bagging比较1、样本选择2、样例权重3、预测函数4、计算5、其他 4、结合策略 二、Adaboost1、介绍2、运行过程3、特点4、代码示例 三、随机森林1、介绍2、随机森林生成3、特点4、优缺点5、代码示例6、参数介绍 四、GBDT1、介…

使用python绘制三维散点图

使用python绘制三维散点图 三维散点图三维散点图的用途效果代码 三维散点图 三维散点图&#xff08;3D Scatter Plot&#xff09;是一种用于展示三维数据的图表。与二维散点图类似&#xff0c;三维散点图通过点在三维空间中的位置来表示数据点的三个特征。每个点在 x、y 和 z …

RTA_OS基础功能讲解 2.9-警报器

RTA_OS基础功能讲解 2.9-警报器 文章目录 RTA_OS基础功能讲解 2.9-警报器一、警报器简介二、警报器配置2.1 激活一个任务2.2 设置一个事件2.3 执行回调函数2.4 递增一个(软件)计数器三、警报器设置3.1 绝对警报3.1.1 单次触发3.1.2 周期触发3.1.3 在过去设置警报3.1.4 将绝对…

微信小程序04: 获取openId和unionId

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 上文小总结1.1.2 上文传送门 2. 获取openId和unionId操作2.1 准备工作2.1.1 请先复制00篇的统一封装代码2.1.2 微信登录请求dto 2.2 具体代码使用与注释如下2.2.1 业务代码2.2.2 代码解释(一)[无需复制]2.2.3 获取的map使用方…

【Python推导式秘籍】:一行代码的艺术,高效数据处理之道

文章目录 &#x1f68b;Python推导式&#x1f680;一、列表推导式&#x1f308;1. 了解推导式❤️2. 实践&#x1f4a5;3. 总结 &#x1f680;二、字典推导式&#x1f308;1. 了解字典推导式❤️2. 实践&#x1f4a5;3. 总结 &#x1f680;三、集合推导式&#x1f308;1. 了解集…

Qwen2的各模型性能、占用显存和推理速度比较(摘自官方文档)

Qwen2的各模型性能、占用显存和推理速度比较&#xff08;摘自官方文档&#xff09; 性能 推理速度&#xff08;从大到小&#xff09; 72B 57B-A14B 7B 1.5B 0.5B

目标检测数据集 - PCB板表面缺陷检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;PCB 板表面缺陷检测数据集&#xff0c;真实采集高质量 PCB 板表面含缺陷图片数据&#xff0c;数据集含多款不同 PCB 板高清表面图片数据&#xff0c;包括俯拍正拍、旋转拍摄姿态。数据标注标签包括 missing_hole、mouse_bite、open_circuit、short、spur…