基于Python搭建簡(jiǎn)易HTTP服務(wù)的兩種方案
一、前言
日常開(kāi)發(fā)、本地文件共享、臨時(shí)傳輸場(chǎng)景中,我們需要快速搭建一個(gè)輕量HTTP服務(wù),無(wú)需部署Nginx、Tomcat等重型服務(wù)。Python 提供了零依賴、開(kāi)箱即用的HTTP服務(wù)能力,既可以使用內(nèi)置模塊快速啟動(dòng)靜態(tài)文件下載服務(wù),也可以自定義代碼實(shí)現(xiàn)瀏覽器可視化上傳、下載、預(yù)覽功能。
以下對(duì)比使用兩種搭建方案:
- 方案一:一行命令啟動(dòng)靜態(tài)下載服務(wù)(極簡(jiǎn)、適合臨時(shí)文件共享)
- 方案二:自定義Python服務(wù),支持瀏覽器上傳+下載+文件列表預(yù)覽(全能實(shí)用)
所有代碼基于Python3.x,無(wú)需安裝第三方庫(kù),原生內(nèi)置,跨Windows/Linux/Mac系統(tǒng)通用。
二、方案一:一行命令啟動(dòng)極簡(jiǎn)文件下載服務(wù)
2.1 功能說(shuō)明
使用Python內(nèi)置http.server模塊,快速將本地文件夾轉(zhuǎn)為Web目錄,瀏覽器可直接訪問(wèn)、預(yù)覽、下載目錄下所有文件,僅支持下載,不支持上傳,適合臨時(shí)文件共享。
2.2 啟動(dòng)命令
打開(kāi)終端,進(jìn)入需要共享的文件目錄,執(zhí)行對(duì)應(yīng)命令:
Python3 通用命令
# 默認(rèn)端口8000,監(jiān)聽(tīng)所有網(wǎng)卡 python -m http.server 8000 # 自定義端口(例如9000) python -m http.server 9000
2.3 訪問(wèn)方式
- 本地訪問(wèn):
http://127.0.0.1:8000 - 局域網(wǎng)訪問(wèn):
http://本機(jī)IP:8000(手機(jī)/其他電腦可訪問(wèn))
2.4 優(yōu)缺點(diǎn)
? 優(yōu)點(diǎn):零配置、一秒啟動(dòng)、無(wú)依賴、跨平臺(tái)
? 缺點(diǎn):僅支持文件下載/預(yù)覽,不支持文件上傳,無(wú)權(quán)限控制,僅適合臨時(shí)使用
三、方案二:自定義HTTP服務(wù)
基于Python內(nèi)置http.server、cgi模塊二次封裝,實(shí)現(xiàn)完整功能:瀏覽器在線查看文件列表、點(diǎn)擊下載文件、選擇文件上傳保存到本地,無(wú)需任何第三方依賴。
3.1 服務(wù)代碼
新建文件 http_file_server.py,復(fù)制以下全部代碼:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Python 簡(jiǎn)易HTTP文件服務(wù)
功能:瀏覽器預(yù)覽文件列表、文件下載、文件上傳
無(wú)第三方依賴,Python3原生支持
"""
import os
import cgi
from http.server import BaseHTTPRequestHandler, HTTPServer
# 配置服務(wù)端口和文件存儲(chǔ)根目錄
SERVER_PORT = 8000
# 服務(wù)運(yùn)行目錄作為文件根目錄
ROOT_DIR = os.getcwd()
class FileServerHandler(BaseHTTPRequestHandler):
# 忽略日志輸出,保持終端干凈
def log_message(self, format, *args):
return
# 渲染HTML頁(yè)面模板
def render_html(self, title, content):
html = f"""
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>{title}</title>
<style>
body {{font-family:微軟雅黑; margin:20px;}}
.box {{border:1px solid #eee; padding:20px; border-radius:8px; margin-bottom:20px;}}
a {{color:#0066cc; text-decoration:none;}}
a:hover {{text-decoration:underline;}}
.file-item {{line-height:2;}}
</style>
</head>
<body>
<h2>{title}</h2>
{content}
</body>
</html>
"""
self.send_response(200)
self.send_header("Content-type", "text/html; charset=utf-8")
self.end_headers()
self.wfile.write(html.encode("utf-8"))
# 展示文件列表 & 上傳表單頁(yè)面
def do_GET(self):
# 拼接頁(yè)面內(nèi)容
upload_form = """
<div class="box">
<h3>文件上傳</h3>
<form method="post" enctype="multipart/form-data">
<input type="file" name="upload_file" />
<button type="submit" style="padding:4px 12px; margin-left:10px;">上傳文件</button>
</form>
</div>
"""
# 遍歷當(dāng)前目錄文件
file_list = "<div class='box'><h3>文件列表(點(diǎn)擊下載)</h3>"
for file in os.listdir(ROOT_DIR):
# 忽略py源碼文件(可選,可刪除)
if file.endswith(".py"):
continue
file_path = os.path.join(ROOT_DIR, file)
file_list += f'<div class="file-item"><a href="{file}" rel="external nofollow" target="_blank">{file}</a></div>'
file_list += "</div>"
# 渲染頁(yè)面
self.render_html("Python文件上傳下載服務(wù)", upload_form + file_list)
# 處理文件上傳請(qǐng)求
def do_POST(self):
try:
# 解析上傳文件
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={"REQUEST_METHOD": "POST"}
)
# 獲取上傳文件對(duì)象
upload_file = form["upload_file"]
file_name = upload_file.filename
# 空文件判斷
if not file_name:
self.render_html("上傳失敗", "<p>未選擇任何文件!</p><a href='/'>返回首頁(yè)</a>")
return
# 寫(xiě)入保存文件
save_path = os.path.join(ROOT_DIR, file_name)
with open(save_path, "wb") as f:
f.write(upload_file.file.read())
# 上傳成功頁(yè)面
self.render_html("上傳成功", f"<p>文件【{file_name}】上傳成功!</p><a href='/'>返回首頁(yè)</a>")
except Exception as e:
self.render_html("上傳失敗", f"<p>上傳異常:{str(e)}</p><a href='/'>返回首頁(yè)</a>")
if __name__ == "__main__":
server = HTTPServer(("0.0.0.0", SERVER_PORT), FileServerHandler)
print(f"? 文件服務(wù)啟動(dòng)成功")
print(f"?? 本地訪問(wèn):http://127.0.0.1:{SERVER_PORT}")
print(f"?? 局域網(wǎng)訪問(wèn):http://本機(jī)IP:{SERVER_PORT}")
print(f"?? 文件根目錄:{ROOT_DIR}")
print("-" * 50)
try:
server.serve_forever()
except KeyboardInterrupt:
server.server_close()
print("? 服務(wù)已關(guān)閉")
3.2 啟動(dòng)服務(wù)
# 直接運(yùn)行腳本 python http_file_server.py
3.3 核心功能
- 文件預(yù)覽/下載:瀏覽器打開(kāi)頁(yè)面,自動(dòng)列出當(dāng)前目錄所有文件,點(diǎn)擊文件名直接下載
- 文件上傳:頁(yè)面選擇本地文件,點(diǎn)擊上傳,自動(dòng)保存到服務(wù)運(yùn)行目錄
- 跨設(shè)備訪問(wèn):支持局域網(wǎng)手機(jī)、其他電腦訪問(wèn)上傳下載文件
- 中文兼容:完美支持中文文件名、中文文件內(nèi)容
四、服務(wù)使用方法
4.1 本地訪問(wèn)
瀏覽器輸入:http://127.0.0.1:8000
4.2 局域網(wǎng)跨設(shè)備訪問(wèn)
- 查看本機(jī)電腦IP(Windows:
ipconfig,Linux/Mac:ifconfig) - 同局域網(wǎng)設(shè)備(手機(jī)/其他電腦)訪問(wèn):
http://電腦IP:8000 - 無(wú)需配置防火墻放行,默認(rèn)本地局域網(wǎng)可通
4.3 操作方式
- 下載文件:頁(yè)面文件列表點(diǎn)擊對(duì)應(yīng)文件,瀏覽器自動(dòng)下載
- 上傳文件:點(diǎn)擊選擇文件 → 選中本地文件 → 點(diǎn)擊上傳,自動(dòng)保存到服務(wù)目錄
五、常見(jiàn)問(wèn)題與注意事項(xiàng)
5.1 端口占用問(wèn)題
若8000端口被占用,修改代碼中 SERVER_PORT 為其他端口(如8080、9000)即可。
5.2 文件保存位置
所有上傳的文件會(huì)自動(dòng)保存到腳本運(yùn)行的目錄,可修改 ROOT_DIR 變量自定義存儲(chǔ)路徑。
5.3 安全說(shuō)明
該服務(wù)為臨時(shí)工具服務(wù),無(wú)賬號(hào)密碼、無(wú)權(quán)限校驗(yàn)、無(wú)加密傳輸,禁止部署在公網(wǎng),僅用于本地、局域網(wǎng)臨時(shí)文件傳輸。
5.4 兼容性
兼容所有Python3.x版本,支持Windows、Linux、Mac系統(tǒng),無(wú)需pip安裝任何依賴。
六、兩種方案對(duì)比
| 方案 | 上傳功能 | 下載功能 | 部署難度 | 適用場(chǎng)景 |
|---|---|---|---|---|
| 方案一 | 不支持 | 支持 | 極低(1秒啟動(dòng)) | 臨時(shí)文件下載、靜態(tài)資源共享 |
| 方案二 | 支持 | 支持 | 低(直接運(yùn)行腳本) | 局域網(wǎng)雙向文件傳輸、臨時(shí)上傳下載工具 |
以上就是基于Python搭建簡(jiǎn)易HTTP服務(wù)的兩種方案的詳細(xì)內(nèi)容,更多關(guān)于Python搭建簡(jiǎn)易HTTP服務(wù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Ubuntu下使用python讀取doc和docx文檔的內(nèi)容方法
今天小編就為大家分享一篇Ubuntu下使用python讀取doc和docx文檔的內(nèi)容方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
python控制結(jié)構(gòu)的條件判斷與循環(huán)示例詳解
這篇文章主要為大家介紹了python控制結(jié)構(gòu)的條件判斷與循環(huán)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
一篇文章搞懂python混亂的切換操作與優(yōu)雅的推導(dǎo)式
這篇文章主要給大家介紹了如何通過(guò)一篇文章搞懂python混亂的切換操作與優(yōu)雅的推導(dǎo)式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-08-08
詳解Python的hasattr() getattr() setattr() 函數(shù)使用方法
這篇文章主要介紹了詳解Python的hasattr() getattr() setattr() 函數(shù)使用方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
Python基礎(chǔ)教程之if判斷,while循環(huán),循環(huán)嵌套
這篇文章主要介紹了Python基礎(chǔ)教程之if判斷,while循環(huán),循環(huán)嵌套 的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
Python3進(jìn)行表格數(shù)據(jù)處理的示例詳解
數(shù)據(jù)處理是一個(gè)當(dāng)下非常熱門(mén)的研究方向,通過(guò)對(duì)于大型實(shí)際場(chǎng)景中的數(shù)據(jù)進(jìn)行建模,可以用于預(yù)測(cè)下一階段可能出現(xiàn)的情況。本文就來(lái)聊聊Python3進(jìn)行表格數(shù)據(jù)處理的相關(guān)操作,需要的可以參考一下2023-03-03
一文淺析Python如何構(gòu)建優(yōu)雅的異常體系
這篇文章主要介紹了Python異常處理的核心原則與最佳實(shí)踐,文內(nèi)首先指出異常處理常被低估,通過(guò)真實(shí)案例展示了不當(dāng)處理帶來(lái)的隱患,隨后解析了Python異常機(jī)制的本質(zhì)是一種控制流信號(hào),并詳細(xì)介紹了異常層級(jí)結(jié)構(gòu),有需要的小伙伴可以了解下2026-03-03
Python 3.6.報(bào)錯(cuò) “module ‘enum‘ has no
這篇文章主要為大家詳細(xì)介紹了Python 3.6.報(bào)錯(cuò) “module ‘enum‘ has no attribute ‘IntFlag‘”的真正原因與解決辦法,文中的示例代碼講解詳細(xì),有需要的可以了解下2025-11-11
pytorch 使用加載訓(xùn)練好的模型做inference
今天小編就為大家分享一篇pytorch 使用加載訓(xùn)練好的模型做inference,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02

