使用Python创建本地Http服务实现与外部系统数据对接

在Python 3.10中创建一个能够处理GET和POST请求的本地HTTP服务器,并提供一个默认的 index.html 页面是完全可行的。Python的标准库中的 http.server 模块虽然简单,但通过一些自定义扩展可以满足这个需求。

下面我将提供一个实现方案,它包含一个自定义的请求处理器,并会说明如何创建 index.html 文件。

Python 3.10 本地HTTP服务器实现

下面是一个使用Python标准库 http.server 模块创建本地HTTP服务器的示例,它可以处理GET和POST请求,并提供一个默认的 index.html 页面。

实现代码

创建一个名为 custom_http_server.py 的Python文件,内容如下:

python

from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import urlparse, parse_qs
import jsonclass CustomHTTPRequestHandler(BaseHTTPRequestHandler):def _set_headers(self, status_code=200, content_type='text/html'):"""设置HTTP响应头"""self.send_response(status_code)self.send_header('Content-type', content_type)self.end_headers()def do_GET(self):"""处理GET请求"""parsed_path = urlparse(self.path)path = parsed_path.path# 默认返回 index.htmlif path == '/' or path == '/index.html':try:with open('index.html', 'rb') as f:content = f.read()self._set_headers(200)self.wfile.write(content)except FileNotFoundError:error_msg = "index.html file not found."self._set_headers(404)self.wfile.write(error_msg.encode('utf-8'))else:# 返回请求的路由信息(实际应用中可根据路径返回不同内容)response = {'method': 'GET','path': path,'query_params': parse_qs(parsed_path.query)}self._set_headers(200, 'application/json')self.wfile.write(json.dumps(response).encode('utf-8'))def do_POST(self):"""处理POST请求"""content_length = int(self.headers.get('Content-Length', 0))post_data = self.rfile.read(content_length)# 尝试解析JSON数据(如果Content-Type是application/json)if self.headers.get('Content-Type') == 'application/json':try:parsed_data = json.loads(post_data.decode('utf-8'))except json.JSONDecodeError:parsed_data = {'raw_data': post_data.decode('utf-8')}else:# 解析表单数据parsed_data = parse_qs(post_data.decode('utf-8'))# 构建响应response = {'method': 'POST','path': self.path,'data_received': parsed_data}self._set_headers(200, 'application/json')self.wfile.write(json.dumps(response, indent=2).encode('utf-8'))def do_HEAD(self):"""处理HEAD请求"""self._set_headers()def run_server(port=8000):"""启动服务器"""server_address = ('', port)httpd = HTTPServer(server_address, CustomHTTPRequestHandler)print(f'Starting server on port {port}...')print(f'Access your server at http://localhost:{port}')try:httpd.serve_forever()except KeyboardInterrupt:print('\nShutting down server...')httpd.shutdown()if __name__ == '__main__':run_server()

创建默认的 index.html 页面

在同一目录下创建一个 index.html 文件:

html

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Python HTTP 服务器</title><style>body {font-family: Arial, sans-serif;max-width: 800px;margin: 0 auto;padding: 20px;background-color: #f5f5f5;}.container {background-color: white;padding: 30px;border-radius: 8px;box-shadow: 0 2px 4px rgba(0,0,0,0.1);}h1 {color: #333;}.api-info {background-color: #f9f9f9;padding: 15px;border-left: 4px solid #4CAF50;margin: 20px 0;}.endpoint {margin: 15px 0;}code {background-color: #eee;padding: 2px 5px;border-radius: 3px;font-family: monospace;}.try-button {background-color: #4CAF50;color: white;padding: 10px 15px;border: none;border-radius: 4px;cursor: pointer;margin-top: 10px;}</style>
</head>
<body><div class="container"><h1>欢迎使用Python HTTP服务器</h1><p>这是一个简单的本地服务器,用于演示如何处理GET和POST请求。</p><div class="api-info"><h2>API端点示例:</h2><div class="endpoint"><h3>GET /api/data</h3><p>获取示例数据</p><button class="try-button" οnclick="testGet()">测试GET请求</button><pre id="get-response"></pre></div><div class="endpoint"><h3>POST /api/data</h3><p>提交数据到服务器</p><button class="try-button" οnclick="testPost()">测试POST请求</button><pre id="post-response"></pre></div></div></div><script>async function testGet() {try {const response = await fetch('/api/data?name=Test&value=123');const data = await response.json();document.getElementById('get-response').textContent = JSON.stringify(data, null, 2);} catch (error) {console.error('Error:', error);}}async function testPost() {try {const response = await fetch('/api/data', {method: 'POST',headers: {'Content-Type': 'application/json',},body: JSON.stringify({name: '示例数据',value: 456,timestamp: new Date().toISOString()})});const data = await response.json();document.getElementById('post-response').textContent = JSON.stringify(data, null, 2);} catch (error) {console.error('Error:', error);}}</script>
</body>
</html>

运行服务器

  1. 将上述两段代码分别保存为 custom_http_server.py 和 index.html,放在同一目录下。

  2. 打开终端或命令提示符,导航到该目录。

  3. 运行以下命令启动服务器:

bash

python custom_http_server.py
  1. 服务器将在默认端口8000上启动。如需指定其他端口,可以修改 run_server() 函数调用,例如 run_server(8080)

  2. 打开浏览器访问 http://localhost:8000,你将看到默认的 index.html 页面。

功能说明

  • GET请求处理

    • 访问根路径(/ 或 /index.html)会返回 index.html 文件内容。

    • 访问其他路径(如 /api/data)会返回一个JSON响应,包含请求的路径和查询参数。

  • POST请求处理

    • 支持接收表单数据(application/x-www-form-urlencoded)和JSON数据(application/json)。

    • 服务器会解析接收到的数据并以JSON格式返回,包含请求的路径和接收到的数据。

  • 静态文件服务

    • 服务器可以提供其他静态文件(如CSS、JS、图片),只需将这些文件放在与服务器脚本相同的目录下,然后通过浏览器访问(例如 http://localhost:8000/filename)即可。

注意事项

  • 开发环境专用:此服务器仅适用于开发和测试环境。它不具备生产环境所需的安全性和性能特性。

  • 安全性:此实现没有身份验证机制、不支持HTTPS加密,且缺乏请求过滤功能。

  • 性能:该服务器是单线程的,在高并发情况下性能有限。对于生产环境,建议使用专业的Web服务器如Nginx、Apache或Python Web框架(如Flask、Django)。

这个实现提供了一个基础框架,你可以根据实际需求进一步扩展功能,例如添加更多路由、实现文件上传或连接数据库等。

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

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

相关文章

了解篇 | StarRocks 是个什么数据库?

今天简要介绍一下StarRocks 这个强大的数据库。注意&#xff1a;本文章内容仅供个人学习&#xff0c;不包含任何推荐性质。StarRocks&#xff08;原名 Doris&#xff09;是一个高性能、全场景的MPP&#xff08;大规模并行处理&#xff09;分析型数据库。它专为极速的多维联机分…

SSL部署完成,https显示连接不安全如何处理?

在部署 SSL 后&#xff0c;如果浏览器仍然显示 “连接不安全” 或 “Not Secure”&#xff0c;通常是由以下几种原因导致的。针对每种可能的原因和问题&#xff0c;以下提供了详细的排查和解决方案。 1. 排查问题的可能原因 1.1 SSL 证书未正确安装 如果 SSL 证书安装不完整或…

LeetCode热题100--105. 从前序与中序遍历序列构造二叉树--中等

1. 题目 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,null,n…

【WitSystem】详解JWT在系统登录过程中前端做了什么事,后端又做了什么事?

要理解 JWT&#xff08;JSON Web Token&#xff09;登录流程中前端与后端的职责分工&#xff0c;需先明确 JWT 的核心定位&#xff1a;它是一种无状态的身份认证令牌&#xff0c;用于替代传统 Session 认证&#xff0c;解决跨服务、跨域登录的问题。其流程本质是“后端生成令牌…

MongoDB 在线安装-一键安装脚本(CentOS 7.9)

1. 脚本概述本脚本用于在 CentOS 7.9 系统上在线安装 MongoDB&#xff0c;自动处理端口占用和重复安装问题&#xff0c;并创建管理员用户 test8&#xff0c;密码 test123。2. 功能停止并关闭防火墙检查 27017 端口占用并结束进程如果已安装 MongoDB&#xff0c;卸载重装配置 Mo…

树形数据结构之树状基础-算法赛

今天给分享的是一道算法决赛的题目&#xff0c;这道题目的综合要求比较高&#xff0c;希望大家可以好好理解&#xff0c;同时这道题用到的是树状树形结构的有关知识。可以用这几天学的相关内容结合起来。问题描述给定两个长度为 N的排列 A 和 B。若一对二元组下标 (i,j) 满足以…

Jenkins 构建清理策略:自带功能 vs Discard Old Build 插件,全场景实操指南

前言&#xff1a;在 Jenkins 持续集成过程中&#xff0c;构建记录、工作空间、产物包会不断积累&#xff0c;既占用磁盘空间&#xff0c;也会让构建历史变得臃肿。Jenkins 自带的“丢弃旧的构建”功能和 Discard Old Build 插件&#xff0c;是两种常见的构建清理方案。本文将详…

Leetcode | Hot100

文章目录两数之和字母异位词分组最长连续序列移动零盛水最多的容器三数之和接雨水无重复字符的最长子串找到字符串中所有字母异位词和为 K 的子数组滑动窗口最大值最小覆盖子串最大子数组和合并区间轮转数组除自身以外数组的乘积缺失的第一个正数矩阵置零螺旋矩阵旋转图像搜索二…

【论文阅读】Uncertainty Modeling for Out-of-Distribution Generalization (ICLR 2022)

论文题目&#xff1a;Uncertainty Modeling for Out-of-Distribution Generalization 论文来源&#xff1a;ICLR 2022 论文作者&#xff1a; 论文链接&#xff1a;https://arxiv.org/pdf/2202.03958 论文源码&#xff1a;https://github.com/lixiaotong97/DSU ​ 一、摘要…

分布式系统单点登录(SSO)状态管理深度解析:从Cookie+Session到JWT的演进之路

分布式系统单点登录(SSO)状态管理深度解析&#xff1a;从CookieSession到JWT的演进之路作者&#xff1a;默语佬 | CSDN博主 在分布式微服务架构盛行的今天&#xff0c;单点登录已成为企业级应用的标准配置。本文将深入探讨SSO状态管理的技术演进&#xff0c;从传统的CookieSess…

从 WPF 到 Avalonia 的迁移系列实战篇7:EventTrigger 的迁移

从 WPF 到 Avalonia 的迁移系列实战篇7&#xff1a;EventTrigger 的迁移 在 WPF 中&#xff0c;EventTrigger 是非常常用的功能&#xff0c;它可以让我们直接在 XAML 中绑定事件与动画或动作&#xff0c;实现 UI 的交互效果。例如按钮点击时旋转、鼠标悬停时变色等。 然而&…

深圳比斯特|电池组PACK自动化生产线厂家概述

电池组PACK自动化生产线是指用于生产电池模组的一套自动化系统。这类生产线主要用于生产各类电池组&#xff0c;如锂离子电池组&#xff0c;应用于电动汽车、储能系统等领域。自动化生产线通过机械设备和计算机控制系统&#xff0c;实现电池组生产过程的自动化和高效率。整条生…

基于librdkafa C++客户端生产者发送数据失败问题处理#2

https://blog.csdn.net/qq_42896627/article/details/149025452?fromshareblogdetail&sharetypeblogdetail&sharerId149025452&sharereferPC&sharesourceqq_42896627&sharefromfrom_link 上次我们介绍了认证失败的问题。这次介绍另一个问题生产者发送失败…

pg卡死处理

[postgresapm ~]$ ps -ef|grep postgres:|grep -v grep|awk {print $2}|xargs kill -9 锁&#xff1a; 1 查找锁表的pid select pid from pg_locks l join pg_class t on l.relation t.oid where t.relkind r and t.relname lockedtable; 2 查找锁表的语句 select pid, …

Spring Boot 与 Elasticsearch 集成踩坑指南:索引映射、批量写入与查询性能

前言Elasticsearch 作为分布式搜索和分析引擎&#xff0c;凭借其高性能、可扩展性和丰富的查询能力&#xff0c;被广泛应用于日志分析、全文检索、电商搜索推荐等场景。 在 Spring Boot 项目中集成 Elasticsearch 已成为很多开发者的日常需求&#xff0c;但真正落地时往往会踩到…

windows 10打开虚拟机平台时,出现错误“找不到引用的汇编”解决办法

通过dism.exe开启虚拟机平台时&#xff0c;出现了以下错误&#xff1a;找不到引用的汇编&#xff0c;如下图所示 通过以下命令进行修复均无效&#xff1a; dism /online /cleanup-image /scanhealth sfc /scannow 最后通过加载windows系统的安装光盘iso, 双击setup.exe以【保…

设计模式(C++)详解——建造者模式(1)

<摘要> 建造者模式是一种创建型设计模式&#xff0c;通过将复杂对象的构建过程分解为多个步骤&#xff0c;使相同的构建过程能够创建不同的表示形式。本文从背景起源、核心概念、设计意图等角度深入解析该模式&#xff0c;结合电脑组装、文档生成等实际案例展示其实现方式…

移动端触摸事件与鼠标事件的触发机制详解

移动端触摸事件与鼠标事件的触发机制详解 在移动端开发中&#xff0c;我们经常会遇到一个现象&#xff1a;一次简单的触摸操作&#xff0c;不仅会触发touch系列事件&#xff0c;还会触发一系列mouse事件&#xff0c;最终甚至会触发click事件。这其实是浏览器为了兼容传统桌面端…

如何科学评估CMS系统性能优化效果?

为什么要评估性能优化效果&#xff1f; 在投入时间精力优化CMS系统后&#xff0c;很多开发者只凭"感觉"判断网站变快了&#xff0c;但这种主观判断往往不可靠。科学评估性能优化效果可以帮助我们&#xff1a; 量化优化成果&#xff1a;用数据证明优化的价值发现潜在问…

中控平台数据监控大屏

中控平台数据监控大屏前言&#xff1a;什么是数据大屏&#xff1f; 数据大屏就像是一个"数字仪表盘"&#xff0c;把复杂的数据用图表、动画等方式直观展示出来。想象一下汽车的仪表盘&#xff0c;能让你一眼看到速度、油量、转速等信息——数据大屏也是这个原理&…