21.12 Python 实现网站服务器
Web服务器本质上是一个提供Web服务的应用程序,运行在服务器上,用于处理HTTP请求和响应。它接收来自客户端(通常是浏览器)的HTTP请求,根据请求的URL、参数等信息生成HTTP响应,并将响应返回给客户端,完成客户端的请求。Web服务器可以使用多种编程语言和技术实现,通过对套接字的处理并遵循HTML等浏览器兼容格式即可实现。
如果需要自行实现一个Web服务器则本质上就是需要完成套接字的处理,并在处理时增加遵循HTTP格式的头部数据即可,如下是一个简单的支持Web服务器的套接字程序,该程序运行后会在本机的80端口侦听,当用于通过浏览器访问时则会自动传输一段话。
import socketdef handle_request(client):buf = client.recv(1024)client.send(bytes("HTTP/1.1 200 OK\r\n\r\n","UTF-8"))client.send(bytes("<b>Hello lyshark</b>","UTF-8"))if __name__ == "__main__":sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.bind(("localhost",80))sock.listen(5)while True:connection, address = sock.accept()handle_request(connection)connection.close()
运行上述代码片段,读者可自行打开浏览器并访问http://localhost:80端口,则此时会弹出一段问候语,说明我们的服务器已经可以被浏览器解析了。

当然上述代码还有很大的优化空间,首先要解决的问题是让页面具有动态渲染的功能,此处我们可以采用jinja2模板,该模板允许在Web应用程序中渲染HTML,其主要特点是可配置性高、快速、安全且易于使用,使用时读者需要自行执行pip install jinja2来安装此模板,至此我们就可以在Web服务器带啊吗中使用模板引擎进行输出。
如下代码片段则是一个使用了make_server类的服务器实现,在代码中我们定义了一个url_func列表用于存储路由规则,路由规则代表的是当有浏览器访问服务器时则自动使用特定规则内的特定函数处理这个规则,在代码中我们分别定义了两个路由函数,其中index()用于展示首页信息,而jinja()则用于展示模板渲染功能实现,至此读者需要在主目录下分别创建两个文件index.html代表网站主页,而jinja.html则代表模板渲染页面,我们以jinja.html为例创建如下代码;
<body>
<h1>{{name}}</h1>
<ul>{% for item in user_list %}<li>{{item}}</li>{% endfor %}
</ul>
</body>
接着编写服务器程序,在jinja()路由函数内通过读取jinja.html文件并使用template.render()函数给特定的变量传入不同的参数,当页面渲染好以后,则通过return将该请求返回给RunServer函数,再由该函数return [response,]返回给被调用客户。
from wsgiref.simple_server import make_server
from jinja2 import Template# /index/的路由函数
def index():with open("./index.html","r",encoding="utf-8")as fp:recv = fp.read()return recv.encode("utf-8")# /jinja/的路由函数
def jinja():with open("./jinja.html","r",encoding="utf-8")as fp:data = fp.read()template = Template(data)recv = template.render(name='John Doe', user_list=['lyshark', 'wang'])return recv.encode("utf-8")# 定义路由规则
url_func = [('/index/',index),('/jinja/',jinja)]def RunServer(environ,star_response):star_response("200 OK",[('Content-Type','text/html;charset=urf-8')])url = environ["PATH_INFO"]rAddr = environ["REMOTE_ADDR"]rHost = environ["HTTP_HOST"]print("[+] 根域名: {} 路径: {} 目标IP: {}".format(rHost,url,rAddr))func = Nonefor i in url_func:if i[0] == url:func = i[1]breakif func:response = func()else:response = b"** 404 not found **"return [response,]if __name__ == "__main__":httpd = make_server("0.0.0.0",80,RunServer)print("[*] 服务已启动 0.0.0.0:80")httpd.serve_forever()
运行上述代码,读者可以打开浏览器并访问localhost/jinja/路径,此时即可看到经过选然后的HTML页面,如下图所示;

相关文章:
21.12 Python 实现网站服务器
Web服务器本质上是一个提供Web服务的应用程序,运行在服务器上,用于处理HTTP请求和响应。它接收来自客户端(通常是浏览器)的HTTP请求,根据请求的URL、参数等信息生成HTTP响应,并将响应返回给客户端ÿ…...
Leetcode.274 H 指数
题目链接 Leetcode.274 H 指数 mid 题目描述 给你一个整数数组 c i t a t i o n s citations citations ,其中 c i t a t i o n s [ i ] citations[i] citations[i] 表示研究者的第 i i i 篇论文被引用的次数。计算并返回该研究者的 h h h 指数。 根据维基百科…...
订单BOM放哪儿?(我的APS项目二)
供应商的小伙伴带来了一个全新的架构,在服务器提供的服务中,有一个对象模型服务,就是数据内存对象;这个方式确实是我在其它架构中没有见到过的。可惜,最初的版本,我们的订单BOM被设计到放在内存对象中。我对…...
从0到1之微信小程序快速入门(03)
目录 什么是生命周期函数 WXS脚本 编辑 与 JavaScript 不同 纯数据字段 组件生命周期 定义生命周期方法 代码示例 组件所在页面的生命周期 代码示例 插槽 什么是插槽 启用多插槽 编辑 定义多插槽 组件通信 组件间通信 监听事件 触发事件 获取组件实例 自…...
【面试高高手】—— docker面试题
文章目录 1. 什么是Docker?它有什么作用?2.Docker容器和虚拟机之间有什么区别?3.如何创建一个Docker容器?4.Docker镜像和容器的区别是什么?5.什么是Dockerfile?能够详细说明下吗?6.什么是Docker Compose&a…...
mac电脑怎么永久性彻底删除文件?
Mac老用户都知道在我们查看Mac内存时都会发现有一条“其他文件”占比非常高,它是Mac储存空间中的“其他”数据包含不可移除的移动资源,如,Siri 语音、字体、词典、钥匙串和 CloudKit 数据库、系统无法删除缓存的文件等。这些“其他文件”无用…...
MySQL(2):环境搭建
1.软件下载 软装去官网下载(社区版):https://downloads.mysql.com/archives/installer/(历史版本可选) 选择下面的,一步到位 2.软件安装 双击 .msi 文件 选完 Custom 自定义后点 next 按 1,…...
Android平台GB28181执法记录仪技术方案
技术背景 我们在做Android平台GB28181设备接入模块的时候,对接过好多开发者,他们都是用于执法记录仪场景,执法记录仪是一种便携式设备,用于记录执法人员的行动和接触情况,通过实时回传音视频数据和实时位置信息给指挥…...
【已解决】VSCode运行C#控制台乱码显示
问题描述 如上图所示,最近在学习C#突然发现我在运行Hello World的时候出现这样的乱码情况。 分析原因 主要是因为VS Code 是UTF-8的编码格式,而我们的PC是Unicode编码,所以我们需要对其进行一个统一即可解决问题。那么知道这个的问题那就开…...
MySQL扩展语句和约束条件
MySQL扩展语句 create TABLE if not exists ky32 (id int(4) zerofill primary key auto_inc rement, #表示该字段可以自增长,默认从1开始每条记录会自动递增1name varchar(10) not null,cradid int(10) not null unique key,hobby varchar (50))&#x…...
Java排序学习
int[] 数组排序 升序排序: Arrays.sort(num);降序排序: num IntStream.of(num) // 变为 IntStream.boxed() // 变为 Stream<Integer>.sorted(Comparator.reverseOrder()) // 按自然序相反排序.mapToInt(Integer::intValue) …...
《2023中国社交媒体平台指南》丨附下载_三叠云
✦ ✦✦ ✦✦ ✦✦ ✦ KAWO发布的《2023中国社交媒体平台指南》,对中国社交媒发展情况、八大社交媒体平台做出详细分析,为营销人员提供了布局社交媒体的实操性指南。 社交媒体八大趋势: 1.社交媒体搜索引擎化 除了社交媒体上发表的内容会被…...
【unity小技巧】unity排序问题的探究
文章目录 前言一、排序图层二、sorting Group的使用三、树木排序设计方法一 代码控制方法二 拆分图片方法三 透视排序1. 普通物品排序2. TileMap瓦片排序设计 完结 前言 unity的排序问题其实之前分享的项目多多少少都有提到一点,但是没有单独拿出来说,所…...
为什么会被【禅道】工具的公司提出QQ群的反思…………
周末备份Gitlab的代码库,把Gitlab更新到了最新的16.5。顺带看了禅道官网出了最新版本18.8。但是禅道的升级更新并不顺利…………。 先说一下为什么用禅道这个工具: 再使用禅道这个工具前,使用过的工具有QC(Quality Center)、jira࿰…...
专业课改革,难度陡然提高,专业课122总分390+南京理工大学818南理工818上岸经验分享
今年专业课相对较难,分数122,基本达到预期。南理工818是信号和数电两门课,各站一半。复试时间数电可能要更多一点,也比信号难拿分。今年专业课难度很大,基本超过不少985学校,大家要重视。 有条件的同学建议…...
Java入门与实践
Java基础 Java入门 idea的使用 idea快捷键 crtlaltt 对选中的代码弹出环绕选项弹出层 问题描述:idea光标变小黑块 解决:误触Insert键,再次按Insert键即可 java基础语法 注释 //单行注释/* 多行注释 *//** 文档注释,可提取到…...
TensorRT量化实战课YOLOv7量化:pytorch_quantization介绍
目录 前言1. 课程介绍2. pytorch_quantization2.1 initialize函数2.2 tensor_quant模块2.3 TensorQuantizer类2.4 QuantDescriptor类2.5 calib模块 总结 前言 手写 AI 推出的全新 TensorRT 模型量化实战课程,链接。记录下个人学习笔记,仅供自己参考。 该…...
【23真题】知识点覆盖全!有罕见判断题!
今天分享的是23年烟台大学833的信号与系统试题及解析。 本套试卷难度分析:本套试题内容难度中等偏下,题目难度不大,但是题量较多,考察的知识点全面,比较多的考察了对信号波形以及频谱图的画法,值得注意的是…...
K8s外部网络访问之Ingress
K8s外部网络访问之Ingress 1 简介2 安装ingress-nginx-controller2.1 下载ingress部署文件2.2 修改deploy.yaml文件参数2.2.1 修改镜像源2.2.2 修改部分参数2.2.3 部署ingress-nginx2.2.4 查看部署结果3.ingress-nginx应用3.1 制作镜像3.2 配置TLS secret3.2.1 创建HTTPS证书3.…...
中文编程工具免费版下载,中文开发语言工具免费版下载
中文编程工具免费版下载,中文开发语言工具免费版下载 中文编程工具开发的实际部分案例如下图 编程系统化课程总目录及明细,点击进入了解详情。 https://blog.csdn.net/qq_29129627/article/details/134073098?spm1001.2014.3001.5502...
translategemma-27b-it部署指南:Ollama模型缓存管理与多版本切换实践
translategemma-27b-it部署指南:Ollama模型缓存管理与多版本切换实践 你是不是也遇到过这样的烦恼:好不容易在Ollama上部署了一个大模型,用了一段时间想试试新版本,结果发现硬盘空间告急,或者不知道旧版本模型文件藏在…...
WordPress主题开发实战:从零开始搭建你的第一个自定义主题(2024最新版)
WordPress主题开发实战:从零开始搭建你的第一个自定义主题(2024最新版) 如果你正准备踏入WordPress主题开发的世界,这篇文章将带你从零开始构建一个完整的自定义主题。不同于简单的仿制或修改现有主题,我们将深入探讨如…...
Repomix构建流程解析:TypeScript编译与打包的完整指南
Repomix构建流程解析:TypeScript编译与打包的完整指南 【免费下载链接】repomix 📦 Repomix (formerly Repopack) is a powerful tool that packs your entire repository into a single, AI-friendly file. Perfect for when you need to feed your cod…...
gte-base-zh场景应用:电商搜索与客服问答的语义匹配实战
gte-base-zh场景应用:电商搜索与客服问答的语义匹配实战 1. 电商场景中的语义匹配挑战 1.1 搜索不精准的痛点分析 在电商平台上,用户搜索"苹果手机"却看到水果苹果的图片,或者输入"轻薄笔记本"却返回游戏本࿰…...
探索粗糙表面波动模型生成:打造不规则之美
粗糙表面,波动模型生成,用于在物体表面生成不规则的粗糙表面,或面表面的波动边界等,可自定义波动分布与赋值。在图形学和模拟领域,生成物体表面的粗糙质感或是波动边界常常是一个有趣又具有挑战性的任务。今天咱们就聊…...
解密数字图像处理中的m邻接:从理论到实战的连通性优化
1. 为什么我们需要m邻接? 第一次接触数字图像处理时,你可能和我一样被各种邻接关系绕晕。记得当时处理一个简单的二值图像,用8邻接做连通区域分析,结果两个明明分开的方块被错误地连在了一起。这就是典型的"歧义路径"问…...
如何快速解锁原神60帧限制:免费开源工具终极指南
如何快速解锁原神60帧限制:免费开源工具终极指南 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 想要在《原神》中体验120帧甚至更高帧率的流畅游戏画面吗?genshi…...
【嵌入式Linux】Libmodbus RTU从源码到实战:基于i.MX6UL的工业通信移植指南
1. 为什么选择Libmodbus RTU在i.MX6UL上做工业通信? 在工业自动化领域,Modbus协议就像设备之间的"普通话",而RTU模式则是其中最省流量、最抗干扰的方言。我去年给一家工厂做设备改造时,发现他们的老式PLC和传感器清一色…...
OpenClaw多模型管理:同时接入百川2-13B-4bits与其他开源大模型
OpenClaw多模型管理:同时接入百川2-13B-4bits与其他开源大模型 1. 为什么需要多模型管理? 去年冬天,我尝试用OpenClaw自动化处理一批技术文档的翻译和摘要任务时,遇到了一个典型问题:当处理简单段落翻译时࿰…...
STM32Fx标准外设固件库下载与安装全攻略
1. STM32Fx标准外设固件库是什么? 对于刚接触STM32开发的工程师来说,标准外设固件库就像是一本"使用说明书"。它封装了芯片底层寄存器的操作,让我们可以用更简单的方式控制硬件。举个例子,如果没有固件库,你…...
