使用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
英文地址,請注明出處:http://en.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;能讓你一眼看到速度、油量、轉速等信息——數據大屏也是這個原理&…