Python中的http.server庫(kù)用法詳細(xì)介紹
前言
http.server 是 Python 標(biāo)準(zhǔn)庫(kù)中的一個(gè)模塊,用于創(chuàng)建基本的 HTTP 服務(wù)器。這個(gè)模塊非常適合用于開(kāi)發(fā)、測(cè)試、以及在本地網(wǎng)絡(luò)中共享文件。以下是對(duì) http.server 模塊的詳細(xì)介紹。
Python 官方文檔:http.server — HTTP 服務(wù)器
模塊概述
http.server
提供了基本的 HTTP 請(qǐng)求處理功能,它包含了以下幾個(gè)核心類(lèi)和方法:
http.server.BaseHTTPRequestHandler:這是所有請(qǐng)求處理類(lèi)的基類(lèi),提供了處理 HTTP 請(qǐng)求的基本框架。它定義了處理 HTTP 請(qǐng)求的方法(如 do_GET、do_POST 等),這些方法需要在子類(lèi)中被實(shí)現(xiàn)或重寫(xiě)。
http.server.SimpleHTTPRequestHandler:這是 BaseHTTPRequestHandler 的一個(gè)子類(lèi),專(zhuān)門(mén)用于處理簡(jiǎn)單的 GET 和 HEAD 請(qǐng)求。它可以直接用于服務(wù)文件系統(tǒng)中的文件,支持簡(jiǎn)單的文件目錄瀏覽。
http.server.CGIHTTPRequestHandler:這是 SimpleHTTPRequestHandler 的一個(gè)子類(lèi),支持 CGI 腳本的執(zhí)行。它允許通過(guò)服務(wù)器運(yùn)行 CGI 腳本,適用于簡(jiǎn)單的動(dòng)態(tài)網(wǎng)頁(yè)服務(wù)器。
http.server.HTTPServer:這是一個(gè)具體的 HTTP 服務(wù)器類(lèi),基于 socketserver.TCPServer 實(shí)現(xiàn)。它用于處理客戶(hù)端的請(qǐng)求并生成響應(yīng)。
http.server.ThreadingHTTPServer:這是 HTTPServer 的多線(xiàn)程版本,每個(gè)請(qǐng)求都會(huì)由一個(gè)單獨(dú)的線(xiàn)程來(lái)處理。
基本用法
以下是如何使用 http.server 模塊的基本示例:
1. 啟動(dòng)一個(gè)簡(jiǎn)單的 HTTP 服務(wù)器
在命令行中,快速啟動(dòng)一個(gè) HTTP 服務(wù)器來(lái)服務(wù)當(dāng)前目錄中的文件:
python -m http.server 8000
這將在當(dāng)前目錄下啟動(dòng)一個(gè) HTTP 服務(wù)器,監(jiān)聽(tīng)端口 8000。
2. 使用 Python 代碼啟動(dòng)服務(wù)器
from http.server import SimpleHTTPRequestHandler, HTTPServer # 設(shè)置服務(wù)器地址和端口 server_address = ('', 8000) # 創(chuàng)建服務(wù)器對(duì)象 httpd = HTTPServer(server_address, SimpleHTTPRequestHandler) # 啟動(dòng)服務(wù)器 print("Serving on port 8000...") httpd.serve_forever()
這段代碼啟動(dòng)了一個(gè) HTTP 服務(wù)器,并在 localhost 的 8000 端口上監(jiān)聽(tīng)。
3. 自定義請(qǐng)求處理程序
通過(guò)繼承 SimpleHTTPRequestHandler
,你可以自定義服務(wù)器對(duì)特定請(qǐng)求的響應(yīng):
from http.server import SimpleHTTPRequestHandler, HTTPServer class MyRequestHandler(SimpleHTTPRequestHandler): def do_GET(self): if self.path == '/hello': self.send_response(200) self.send_header("Content-type", "text/html") self.end_headers() self.wfile.write(b"Hello, World!") else: super().do_GET() # 創(chuàng)建服務(wù)器對(duì)象 httpd = HTTPServer(('', 8000), MyRequestHandler) # 啟動(dòng)服務(wù)器 print("Serving on port 8000...") httpd.serve_forever()
4. CGI 支持
使用 CGIHTTPRequestHandler
運(yùn)行支持 CGI 腳本的服務(wù)器:
from http.server import HTTPServer, CGIHTTPRequestHandler # 設(shè)置服務(wù)器地址和端口 server_address = ('', 8000) # 啟用CGI處理程序 httpd = HTTPServer(server_address, CGIHTTPRequestHandler) # 啟動(dòng)服務(wù)器 print("Serving on port 8000 with CGI support...") httpd.serve_forever()
CGI 處理程序允許你在服務(wù)器上運(yùn)行諸如 Python 腳本等 CGI 程序。
5. 啟用 HTTPS 支持
雖然 http.server
默認(rèn)只支持 HTTP,但可以通過(guò) ssl 模塊添加 HTTPS 支持:
from http.server import SimpleHTTPRequestHandler, HTTPServer import ssl # 創(chuàng)建服務(wù)器對(duì)象 httpd = HTTPServer(('', 8000), SimpleHTTPRequestHandler) # 添加SSL/TLS層 httpd.socket = ssl.wrap_socket(httpd.socket, keyfile="path/to/key.pem", certfile='path/to/cert.pem', server_side=True) # 啟動(dòng)服務(wù)器 print("Serving on https://localhost:8000...") httpd.serve_forever()
關(guān)鍵方法和屬性
- do_GET(self):處理 GET 請(qǐng)求。子類(lèi)可以重寫(xiě)此方法以自定義處理邏輯。
- do_POST(self):處理 POST 請(qǐng)求。子類(lèi)可以重寫(xiě)此方法。
- send_response(self, code, message=None):發(fā)送 HTTP 響應(yīng)代碼和可選的消息。
- send_header(self, keyword, value):發(fā)送 HTTP 標(biāo)頭。
- end_headers(self):發(fā)送 HTTP 響應(yīng)的結(jié)束標(biāo)記。
- log_message(self, format, *args):記錄服務(wù)器日志信息。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 簡(jiǎn)單易用:非常適合開(kāi)發(fā)和測(cè)試階段。
- 內(nèi)置于Python標(biāo)準(zhǔn)庫(kù):不需要安裝任何額外的依賴(lài)。
- 輕量級(jí):?jiǎn)?dòng)速度快,適合小型任務(wù)。
缺點(diǎn):
- 功能有限:不適合用于生產(chǎn)環(huán)境,缺乏復(fù)雜的認(rèn)證、日志記錄和錯(cuò)誤處理機(jī)制。
- 性能瓶頸:由于是單線(xiàn)程(除非使用 ThreadingHTTPServer),在高并發(fā)情況下性能較差。
總結(jié)
http.server
是一個(gè)非常有用的工具,可以快速搭建一個(gè)基本的 HTTP 服務(wù)器,尤其是在開(kāi)發(fā)和測(cè)試階段。但它并不適合作為生產(chǎn)環(huán)境的服務(wù)器。如果你需要更強(qiáng)大的功能和性能,建議使用專(zhuān)門(mén)的 Web 框架或服務(wù)器軟件,如 Flask、Django、或者 Nginx、Apache 等。
相關(guān)文章
Python爬蟲(chóng)中Selenium實(shí)現(xiàn)文件上傳
這篇文章主要介紹了Python爬蟲(chóng)中Selenium實(shí)現(xiàn)文件上傳,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Django數(shù)據(jù)庫(kù)類(lèi)庫(kù)MySQLdb使用詳解
Django項(xiàng)目要操作數(shù)據(jù)庫(kù),首先要和數(shù)據(jù)庫(kù)建立連接,才能讓程序中的數(shù)據(jù)和數(shù)據(jù)庫(kù)關(guān)聯(lián)起來(lái)進(jìn)行數(shù)據(jù)的增刪改查操作。這篇文章主要介紹了Django數(shù)據(jù)庫(kù)類(lèi)庫(kù)MySQLdb使用詳解,感興趣的小伙伴們可以參考一下2019-04-04python實(shí)現(xiàn)連續(xù)圖文識(shí)別
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)連續(xù)圖文識(shí)別功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12python lambda表達(dá)式(匿名函數(shù))寫(xiě)法解析
這篇文章主要介紹了python lambda表達(dá)式(匿名函數(shù))寫(xiě)法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09tensorflow與numpy的版本兼容性問(wèn)題的解決
這篇文章主要介紹了tensorflow與numpy的版本兼容性問(wèn)題的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Python?中將數(shù)字轉(zhuǎn)換為字母的方法
本文詳細(xì)介紹了在 Python 中將數(shù)字轉(zhuǎn)換為字母的幾種常用方法,我們介紹了使用 chr() 函數(shù)、string 模塊和 ord() 函數(shù)等方法,并提供了示例代碼幫助你理解和應(yīng)用這些方法,感興趣的朋友跟隨小編一起看看吧2023-06-06Python使用Tesseract實(shí)現(xiàn)從圖像中讀取文本
Tesseract?是一個(gè)基于計(jì)算機(jī)的系統(tǒng),用于光學(xué)字符識(shí)別?(OCR)?和其他圖像到文本處理,本文將介紹如何使用?Python?中的?Tesseract?創(chuàng)建一個(gè)可以從圖像中讀取文本的程序,需要的可以參考下2023-11-11