Python学习---基于HTTP的服务端基础框架搭建案例

 整体功能:

1 创建框架构建相关的文件夹

2 创建app,模块文件
3 在 app模块文件中创建application函数(用于处理请求)
4 将request_handler()中的处理逻辑交由app模块的application函数完成

5 app模块的 application函数返回响应报文

6 在application 文件夹中创建一个utils 模块
7 utils 模块中创建 create_http_response() 函数,专门用来拼接响应报文
8 修改 app模块的application的返回响应协议的部分

  逻辑关系:

 文件架构:

 main.py

# TCP服务端
import socket
from application import appclass WebServer(object):def __init__(self):# 1,导入模块# 2·创建套接字tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 3·设置地址重用tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)# 4、绑定端口address = ("", 10000)tcp_server_socket.bind(address)# 5﹑设置监听·让套接字由主动变为被动接收tcp_server_socket.listen(128)self.tcp_server_socket = tcp_server_socketdef start(self):"""启动Web服务器"""# 6﹑接受客户端连接 定义函数request——handler()while True:new_client_socket, ip_port = self.tcp_server_socket.accept()print(f"新的连接请求:{ip_port}")# 调用函数处理请求self.request_handler(new_client_socket, ip_port)def request_handler(self, new_client_socket, ip_port):"""接收数据并响应:return:"""# 7.接收客户端浏览器发送的请求协议request_data = new_client_socket.recv(1024)# 8﹑判断协议是否为空if not request_data:print(f"{str(ip_port)}客户端已经下线!!!")new_client_socket.close()return# 使用application文件夹下的app模块处理response_data = app.application("static", request_data, ip_port)new_client_socket.send(response_data)new_client_socket.close()returndef main():# 创建对象ws = WebServer()ws.start()if __name__ == '__main__':main()

app.py

"""
解析客户端浏览器发送的消息,并将响应信息发回
"""
from application import utilsdef parse_request(request_data, ip_port):"""解析请求报文,返回客户端请求的资源路径:param request_data: 接受到的客户端请求信息:param ip_port: 客户端IP地址:return: 客户端请求的资源路径"""# 根据客户端请求的资源返回对应资源# 1 解码得到请求字符串request_text = request_data.decode()loc = request_text.find("\r\n")# 2 得到请求行request_line = request_text[:loc]# 3按空格拆分得到对应信息request_line_list = request_line.split(" ")file_path = request_line_list[1]print(f"{str(ip_port)}正在请求{file_path}资源,服务器已成功响应!")# 设置默认首页if file_path == "/":file_path = "/index.html"return file_pathdef application(current_dir, request_data, ip_port):"""解析客户端的请求信息,找到目标资源路径并返回资源:param current_dir:服务器资源根目录:param request_data: 客户端请求资源信息:param ip_port: 客户端IP地址:return: 客户端请求的内容"""file_path = parse_request(request_data, ip_port)resource_path = current_dir + file_path# 9.4响应主体# response_body = "<html><h>HelloWorld!<h/><html/>"# 通过读取文件内容返回客户端try:with open(resource_path, "rb") as file:response_body = file.read()response_data=utils.create_http_response("200 OK", response_body)except Exception as e:# 重新修改响应行404response_body = f"Error! {str(e)}".encode()response_data = utils.create_http_response("404 Not Found", response_body)# 10、发送响应报文return response_data

 utils.py

def create_http_response(status, response_body):# 9﹑拼接响应的报文# 9.1响应行response_line = f"HTTP/1.1 {status}\r\n"# 9.2响应头response_header = "Server:Python20ws/21.1\r\n"# 9.3响应空行response_blank = "\r\n"response_data = (response_line + response_header + response_blank).encode() + response_bodyreturn response_data

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

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

相关文章

淘工厂订单导出自动化工具

目录 下载安装与运行 主要目的 其他工具的弊端 本工具的优势 视频演示 下载新版后的注意事项 支持的导出项 什么叫一单多拍 常见问题 如何实现快捷登录 导出卡住时如何操作 如何精确导出 下载安装与运行 下载、安装与运行 语雀 主要目的 导出订单信息&#xf…

知识分享:隔多久查询一次网贷大数据信用报告比较好?

随着互联网金融的快速发展&#xff0c;越来越多的人开始接触和使用网络贷款。而在这个过程中&#xff0c;网贷大数据信用报告成为了评估借款人信用状况的重要依据。那么&#xff0c;隔多久查询一次网贷大数据信用报告比较好呢?接下来随小易大数据平台小编去看看吧。 首先&…

某钢铁企业数字化转型规划案例(114页PPT)

案例介绍&#xff1a; 该钢铁企业的数字化转型案例表明&#xff0c;数字化转型是钢铁企业应对市场竞争、提高生产效率、降低成本、优化资源配置和降低能耗排放的重要手段。通过引入先进的技术和管理理念&#xff0c;加强员工培训和人才引进&#xff0c;企业可以成功实现数字化…

欢乐钓鱼大师游戏攻略:自动钓鱼技巧!

《欢乐钓鱼大师》是一款极具趣味性和挑战性的钓鱼模拟游戏&#xff0c;为玩家提供了一个体验钓鱼乐趣的虚拟世界。从湖泊到河流&#xff0c;再到广袤的海洋&#xff0c;游戏中的各种钓场让人流连忘返。无论是新手钓友&#xff0c;还是经验丰富的老钓手&#xff0c;都可以在游戏…

k8s集群中pod的容器资源限制和三种探针

一、资源限制 总结&#xff1a; requests表示创建pod时预留的资源&#xff0c;limits表示pod能够使用资源的最大值。requests值可以被超&#xff0c;limits值不能超过&#xff0c;如果是内存使用超过limits会触发oom然后杀掉进程&#xff0c;如果是cpu超过limits会压缩cpu的使用…

20.SkyWalking

一.简介 SkyWalking用于应用性能监控、分布式链路跟踪、诊断&#xff1a; 参考连接如下&#xff1a; https://github.com/apache/skywalking https://skywalking.apache.org/docs/ 二.示例 通过官网连接进入下载页面&#xff1a;https://archive.apache.org/dist/skywalkin…

揭秘章子怡成功之路:她是如何征服世界的?

章子怡的演艺生涯可谓是一部传奇❗❗❗ 从一个普通工人家庭的女孩&#xff0c;到如今的国际巨星 她的每一步都充满了努力和汗水 她的舞蹈基础为她日后的演艺事业奠定了坚实的基础 而她对戏剧和电影的热爱更是让她在演艺道路上不断前行 从《我的父亲母亲》到《卧虎藏龙》&…

代码随想录|Day55|动态规划 part15|● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 class Solution: def isSubsequence(self, s: str, t: str) -> bool: dp [[0] * (len(t) 1) for _ in range(len(s) 1)] for i in range(1, len(s) 1): for j in range(1, len(t) 1): if s[i - 1] t[j - 1]: dp[i][j] dp[i - 1][j - 1] 1 else: dp[i…

【UE5.1 角色练习】06-角色发射火球-part2

目录 效果 步骤 一、火球生命周期 二、添加可被伤害的NPC 三、添加冲量 在上一篇&#xff08;【UE5.1 角色练习】06-角色发射火球-part1&#xff09;基础上继续实现角色发射火球相关功能 效果 步骤 一、火球生命周期 为了防止火球没有命中任何物体而一直移动下去&#…

【全开源】赛事报名系统源码(Fastadmin+ThinkPHP和Uniapp)

基于FastadminThinkPHP和Uniapp开发的赛事报名系统&#xff0c;包含个人报名和团队报名、成绩查询、成绩证书等。 构建高效便捷的赛事参与平台 一、引言&#xff1a;赛事报名系统的重要性 在举办各类赛事时&#xff0c;一个高效便捷的报名系统对于组织者和参与者来说都至关重…

WebService的wsdl详解

webservice服务的wsdl内容详解&#xff0c;以及如何根据其内容编写调用代码 wsdl示例 展示一个webservice的wsdl&#xff0c;及调用这个接口的Axis客户端 wsdl This XML file does not appear to have any style information associated with it. The document tree is shown…

编译aosp刷入pixel 真机得问题记录

编译aosp要做什么&#xff08;ubuntu下编译问题相对少&#xff09; 需要vmware并且已经安装了ubuntu镜像系统 直接切换到root 避免后期避免麻烦 参考地址 https://mp.weixin.qq.com/s/yJp3ijIxykiMmNVYr2V1nQ apt install git //安装git sudo apt install git//给git设置用户…

mysql事务 事务并发问题 隔离级别 以及原理

mysql事务 简介&#xff1a;事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 事务四大特性 原子性&#xff08;Atomici…

.哈希表.

哈希 哈希表&#xff1a;将大而复杂的数据映射到紧凑的区间内。分为&#xff1a;①存储结构 &#xff08;离散化是特殊的哈希&#xff0c;之前讲的离散化是严格保序的 映射到区间上是连续递增的&#xff09; 哈希不保序&#xff0c;这里讲的是一般的哈希 弊端&#xff1a;若…

Linux(四)

Linux&#xff08;四&#xff09; shell脚本shell脚本开发过程创建创建.sh文件编写.sh文件添加执行的权限 chmod 777 1.sh运行 shell中注释shell中变量用户自定义变量 (尽量大写)位置参数即命令行参数预定义变量环境变量 shell中程序和语句说明性语句功能性语句echo 输出read 键…

网上打印试卷的步骤是什么

对于学生和家长来说&#xff0c;打印试卷是日常学习中的一项重要需求。那么&#xff0c;如何在网上方便地打印试卷呢&#xff1f;下面&#xff0c;就让我来为您介绍琢贝云打印的试卷打印步骤。 一、选择琢贝云打印的原因 支持多种文件格式打印&#xff0c;包括图片、PPT、PDF、…

每日百万交易的支付系统,如何设置JVM堆内存大小?

每日百万交易的支付系统,如何设置JVM堆内存大小? 1、支付背景的引入2、支付的核心业务流程3、每日百万交易支付系统的压力在哪里?4、支付系统每秒钟需要处理多少笔支付单5、每个支付订单处理需要耗时多久6、每个支付订单大概需要多大的内存空间7、每秒发起的支付请求对内存的…

手撕C语言题典——消失的数字

目录 前言 一&#xff0c;思路 1)排序查找 2&#xff09;数据求和&#xff0c;依次减去中值 3&#xff09; 异或 二&#xff0c;异或的代码实现 前言 依旧是一道力扣上的题&#xff0c;通过不同思路的不同时间复杂度来分析&#xff0c;让我们看看有什么不同。 面试题 17…

贪心-ACW803区间合并-XMUOJ力量碎片合并

题目 思路 附上几个参考链接 for(auto i : v)遍历容器元素_for auto 遍历-CSDN博客 C pair的基本用法总结&#xff08;整理&#xff09;_c pair用法-CSDN博客 使用 sort 实现自定义排序 - AcWing 话不多说&#xff0c;直接上代码 代码 /* ACW803区间合并-XMUOJ力量碎片合…

第13章-循迹功能 循迹小车讲解 原理分析 STM32智能小车循迹教程 红外对管使用 PID循迹算法分析

讲解一下我们小车里面的循迹部分&#xff0c;包括红外基础使用&#xff0c;无PID循迹和有PID循迹。 第13章-循迹功能 13.1-非PID循迹功能完成 先红外对管调试 我们这里学习一下&#xff0c;如何实现循迹功能 如何才能让小车沿着黑线运动、要让小车感知到黑线的位置&#x…