Python的HTTP庫及示例

brucexia發表於2023-05-08


HTTP Hyper Text Transfer Protocol )是一個客戶端和伺服器端請求和應答的標準。客戶端是終端使用者,伺服器端是網站。客戶端發起一個到伺服器上指定埠的HTTP 請求,伺服器向客戶端發回一個狀態行和響應的訊息。

可以使用下面的模組建立Internet Server

1 socketserver :以socket 為基礎,建立一般性的IP Server

2 http :透過http 模組中的子模組server client 提供各種網路服務。


socketserver模組


socketserver 模組提供了一個架構來簡化網路(包括伺服器)的編寫工作,使用者不需要使用低階的socket 模組。

socketserver 模組包含的基本類如下:

1 TCPServer((hostname, port), handler) :支援TCP 的伺服器。其中,hostname 是主機名稱,通常是空白字串;port 是通訊埠號碼;handler BaseRequestHandler 類的例項變數。

2 UDPServer((hostname, port), handler) :支援UDP 的伺服器。其中,hostname 是主機名稱,通常是空白字串;port 是通訊埠號碼;handler BaseRequestHandler 類的例項變數。

3 UnixStreamServer((hostname, port), handler) :使用UNIX 網域socket 支援串流導向協議(stream-oriented protocol )的伺服器。其中,hostname 是主機名稱,通常是空白字串;port 是通訊埠號碼;handler BaseRequestHandler 類的例項變數。

4 UnixDatagramServer((hostname, port), handler) :使用UNIX 網域socket 支援資料通訊協議(datagram-oriented protocol )的伺服器。其中,hostname 是主機名稱,通常是空白字串;port 是通訊埠號碼;handler BaseRequestHandler 類的例項變數。

下面是socketserver 模組中類的類變數:

1 request_queue_size :儲存要求佇列的大小,該佇列用於傳給socket listen() 方法。

2 socket_type :返回伺服器使用的socket 型別,可以是socket.SOCK_STREAM socket.SOCK_DGRAM

下面是socketserver 模組中類的屬性與方法:

1 address_family :可以是socket.AF_INET socket.AF_UNIX 。伺服器的通訊協議群組。

2 fileno() :返回伺服器socket 的整數檔案描述元(integer file descriptor )。

3 handle_request() :建立一個處理函式類的例項變數,以及呼叫handle() 方法處理單一請求。

4 RequestHandlerClass :儲存使用者提供的請求處理函式類。

5 server_address :返回伺服器監聽用的IP 地址與通訊埠號碼。

6 serve_forever() :操作一個迴圈來處理無限的請求。

下面的示例演示StreamRequestHandler 類的使用。

import socketserver
port = 50007
class myRequestHandler(socketserver.StreamRequestHandler):
    def handle(self):
        print ("Connection by ", self.client_address)
        self.wfile.write("data")
s = socketserver.TCPServer(("", port), myRequestHandler)
s.serve_forever()

server模組


http 模組的子模組server 提供了各種HTTP 服務,主要包括BaseHTTPServer CGIHTTPServer 類及SimpleHTTPServer 類。

server 模組以socketserver 模組為基礎,並且很少直接使用。server 模組定義了兩個基類來操作基本的HTTP 伺服器(網站伺服器)。

server 模組的第一個基類是HTTPServer 類,其語法如下:

class HTTPServer((hostname, port), RequestHandlerClass)

HTTPServer 類由socketserver.TCPServer 類派生。此類先建立一個HTTPServer 物件並監聽(hostname, port) ,然後使用RequestHandlerClass 來處理要求。

server 模組的第二個基類是BaseHTTPRequestHandler 類,其語法如下:

class BaseHTTPRequestHandler(request, client_address, server)

使用者必須建立一個BaseHTTPRequestHandler 類的子類來處理HTTP 請求。如果要處理GET 請求,就必須重新定義do_GET() 方法;如果要處理POST 請求,就必須重新定義do_POST() 方法。

下面是BaseHTTPRequestHandler 類的類變數:

1 BaseHTTPRequestHandler.server_version

2 BaseHTTPRequestHandler.sys_version

3 BaseHTTPRequestHandler.protocol_version

4 BaseHTTPRequestHandler.error_message_format

每一個BaseHTTPRequestHandler 類的例項變數都有以下屬性:

1 client_address :返回一個2 -tuple(hostname, port) ,為客戶端的地址。

2 command :識別請求的種類,可以是GET POST 等。

3 headers :返回一個HTTP 表頭。

4 path :返回請求的路徑。

5 request_version :返回請求的HTTP 版本字串。

6 rfile :包含輸入流。

7 wfile :包含輸出流。

每一個BaseHTTPRequestHandler 類的例項變數都有以下方法:

1 handle() :請求分派器。此方法會呼叫以 do_ 開頭的方法,如do_GET() do_POST() 等。

2 send_error(error_code [, error_message]) :將錯誤訊號傳輸給客戶端。

3 send_response(response_code [, response_message]) :傳輸響應表頭。

4 send_header(keyword, value) :寫入一個 MIME 表頭到輸出流,此表頭包含表頭的鍵值及其值。

5 end_header() :用來識別MIME 表頭的結尾。

下面的示例演示BaseHTTPRequestHandler 類的使用方法。

import http.server
htmlpage = """
<html><head><title>Web Page</title></head>
<body>Hello Python</body></html>"""
class myHandler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path == "/":
            self.send_response(200)
            self.send_header("Content-type", "text/html")
            self.end_headers()
            self.wfile.write(htmlpage)
        else:
            self.send_error(404, "File not found")
           
myServer = http.server.HTTPServer(("", 80), myHandler)
myServer.serve_forever()

SimpleHTTPServer 類可以處理HTTP server 的請求,也可以處理所在目錄的檔案,即HTML 檔案。SimpleHTTPRequestHeader 類的語法格式如下:

class SimpleHTTPRequestHandler(request, (hostname, port), server)

SimpleHTTPRequestHeader 類有以下兩個屬性:

1 SimpleHTTPRequestHeader.server_version 。定義伺服器模組的級別

2 SimpleHTTPRequestHeader.extensions_map :一個字典集,用於對映副檔名與 MIME 型別。

下面的示例演示SimpleHTTPRequestHandler 類的使用方法。

import http.server
myHandler = http.server.SimpleHTTPRequestHandler
myServer = http.server.HTTPServer(("", 80), myHandler)
myServer.serve_forever()

CGIHTTPRequestHeader 類除了可以處理所在目錄的HTML 檔案外,還可以執行客戶端執行CGI Common Gateway Interface )指令碼。CGIHTTPRequestHeader 類的語法格式如下:

class CGIHTTPRequestHandler(request, (hostname, port), server)

CGIHTTPRequestHeader 類的屬性cgi_directories 包含一個可以儲存CGI 指令碼的資料夾列表。

下面的示例演示CGIHTTPRequestHandler 類的使用方法。

import cgihttpserver
import BaseHTTPServer
class myHandler(http.server.CGIHTTPRequestHandler):
    cgi_directories = ["/cgi-bin"]
myServer = http.server.HTTPServer(("", 80), myHandler)
myServer.serve_forever()

client模組


client 模組主要處理客戶端的請求。client 模組的HTTPConnection 類建立並返回一個connection 物件。HTTPConnection 類的語法格式如下:

class HTTPConnection ([hostname [, port]])

如果引數port 沒有設定,預設值是80 。如果所有的引數都沒有設定,就必須使用connect() 方法自行連線。以下3 HTTPConnection 類的例項變數都會連線到相同的伺服器:

import http.client
h1 = http.client.HTTPConnection (")
h2 = http.client.HTTPConnection (")
h3 = http.client.HTTPConnection (", 80)

HTTPConnection 類的例項變數的方法如下:

1 endheaders() :寫入一行空白給伺服器,表示這是客戶端請求表頭的結尾。

2 connect([hostname [, port]]) :建立一個連線。

3 getresponse() :返回伺服器的狀態。

4 request() :向伺服器傳送請求。

5 putheader(header, argument1 [, ...]) :寫入客戶端請求表頭的表頭行。每一行包括header 、一個冒號(: )、一個空白及argument

6 putrequest(request, selector) :寫入客戶端請求表頭的第一行。引數 request 可以是 GET POST PUT HEAD ,引數selector 是要開啟的檔名稱。

7 send(data) :呼叫endheaders() 方法後,傳輸資料給伺服器。

下面的示例返回 檔案,並將此檔案儲存為一個新檔案。

【例13.3 】使用HTTPConnection 類(原始碼\ch13\13.3.py )。

import http.client
#指定主機名稱
url = "
#指定開啟的檔名稱
urlfile = "/News.html"
#連線到主機
host = http.client.HTTPConnection (url)
#寫入客戶端要求表頭的第一行
host.request("GET", urlfile)
#獲取伺服器的響應
r1=host.getresponse()
#列印伺服器返回的狀態
print(r1.status,r1.reason)
#將file物件的內容存入新檔案
file = open("13.1.html", "w")
#讀取網頁內容,以utf-8方式儲存
str = r1.read().decode("utf-8")
#尋找文字
print(str.find("mlive"))
#寫到檔案並將'xa0'替換為空字元
file.write(str.replace('\xa0',''))
#關閉檔案
file.close()

儲存並執行程式,即可將 檔案的內容儲存在 13.1.html 檔案中。

 

本文節選自《 Python 程式設計從零開始學(影片教學版) 》,本次內容釋出,獲得作者和出版社授權。

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18841117/viewspace-2950712/,如需轉載,請註明出處,否則將追究法律責任。

相關文章