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…

5.26总结

P5318 【深基18.例3】查找文献 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a; 利用两个vector数组&#xff0c;用一个结构体vector&#xff08;为了节省空间&#xff0c;咱用vector来存&#xff09;存储每个边的起点和终点&#xff0c;然后用一个二维vector…

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

章子怡的演艺生涯可谓是一部传奇❗❗❗ 从一个普通工人家庭的女孩&#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…

MSE-DS学位的网站汇总

&#x1f31f;Student knowledge base 链接汇总: https://online.seas.upenn.edu/student-knowledge-base/ (unofficial) degree planner 学位规划&#xff0c;学生自制: https://www.pennplanner.com/ Academic calendar 教学日历放假开学时间: https://online.seas.upenn.e…

FFmpeg 使用文档介绍一:细节描述和流选择

FFmpeg FFmpeg是一个开源的软件项目,它提供了一套用于处理多媒体数据的库和工具集。FFmpeg支持多种音视频编解码器和格式,可以用来进行视频转换、音频转换、流媒体处理、视频捕获、播放、视频剪辑、合并、添加特效等多种操作。 官网:https://ffmpeg.org/使用文档 原文地址…

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

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

PDB表空间如何实现基于时间点恢复PITR呢

现在ORACLE多租户使用越来越多&#xff0c;如果某个PDB的某个表空间中表出现了误操作&#xff0c;如何能快速处理呢&#xff1f; 我们知道&#xff0c;从ORACLE 11G开始, ORACLE就提供了表空间基于时间点的恢复&#xff0c;那么&#xff0c;如果是12C以上&#xff0c;使用了PD…

【全开源】赛事报名系统源码(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…

从0到1,5步打造安全HTTPS网站:Nginx实战教程

部署一个安全的HTTPS站点使用Nginx作为Web服务器涉及几个关键步骤&#xff0c;以下是一个全面的教程&#xff0c;概括了从安装必要的SSL模块到配置HTTPS并实现HTTP到HTTPS的自动重定向的全过程。 1. 安装Nginx并确认SSL模块确保Nginx已经安装&#xff0c;并且启用了http_ssl_m…

【C++扩展】函数别名

引言 int f(int param) {return d(param); }上面这段代码看着是不是很不合理&#xff0c;为什么不直接调用d函数&#xff0c;而非要通过f函数来调用d函数&#xff1f; 正文 意义 引言部分抛出的问题如何解答&#xff1f; 其实&#xff0c;抛开代码的语义和业务功能&#xf…

.哈希表.

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