http.server --- máy chủ HTTP

Source code: Lib/http/server.py


Mô-đun này xác định các lớp để triển khai máy chủ HTTP.

Cảnh báo

http.server không được khuyến khích sử dụng trong sản xuất. Nó chỉ thực hiện basic security checks.

sẵn có: not WASI.

Mô-đun này không hoạt động hoặc không có trên WebAssembly. Xem Nền tảng WebAssugging để biết thêm thông tin.

Một lớp, HTTPServer, là lớp con socketserver.TCPServer. Nó tạo và lắng nghe tại ổ cắm HTTP, gửi yêu cầu đến trình xử lý. Mã để tạo và chạy máy chủ trông như thế này:

def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
    server_address = ('', 8000)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()
class http.server.HTTPServer(server_address, RequestHandlerClass)

Lớp này xây dựng trên lớp TCPServer bằng cách lưu trữ địa chỉ máy chủ dưới dạng các biến thể hiện có tên là server_nameserver_port. Trình xử lý có thể truy cập máy chủ, thường thông qua biến thể hiện server của trình xử lý.

class http.server.ThreadingHTTPServer(server_address, RequestHandlerClass)

Lớp này giống với HTTPServer nhưng sử dụng các luồng để xử lý các yêu cầu bằng cách sử dụng ThreadingMixIn. Điều này rất hữu ích để xử lý các ổ cắm mở trước trình duyệt web, trên đó HTTPServer sẽ đợi vô thời hạn.

Added in version 3.7.

class http.server.HTTPSServer(server_address, RequestHandlerClass, bind_and_activate=True, *, certfile, keyfile=None, password=None, alpn_protocols=None)

Lớp con của HTTPServer có ổ cắm được bọc bằng mô-đun ssl. Nếu mô-đun ssl không có sẵn, việc khởi tạo đối tượng HTTPSServer không thành công với RuntimeError.

Đối số certfile là đường dẫn đến tệp chuỗi chứng chỉ SSL và keyfile là đường dẫn đến tệp chứa khóa riêng.

Một password có thể được chỉ định cho các tệp được bảo vệ và gói bằng PKCS#8, nhưng hãy cẩn thận vì điều này có thể làm lộ mật khẩu được mã hóa cứng một cách rõ ràng.

Xem thêm

Xem ssl.SSLContext.load_cert_chain() để biết thêm thông tin về các giá trị được chấp nhận cho certfile, keyfilepassword.

Khi được chỉ định, đối số alpn_protocols phải là một chuỗi các chuỗi chỉ định giao thức "Thương lượng giao thức lớp ứng dụng" (ALPN) được máy chủ hỗ trợ. ALPN cho phép máy chủ và máy khách đàm phán giao thức ứng dụng trong quá trình bắt tay TLS.

Theo mặc định, nó được đặt thành ["http/1.1"], nghĩa là máy chủ hỗ trợ HTTP/1.1.

Added in version 3.14.

class http.server.ThreadingHTTPSServer(server_address, RequestHandlerClass, bind_and_activate=True, *, certfile, keyfile=None, password=None, alpn_protocols=None)

Lớp này giống với HTTPSServer nhưng sử dụng các luồng để xử lý các yêu cầu bằng cách kế thừa từ ThreadingMixIn. Điều này tương tự với việc ThreadingHTTPServer chỉ sử dụng HTTPSServer.

Added in version 3.14.

HTTPServer, ThreadingHTTPServer, HTTPSServerThreadingHTTPSServer phải được cấp RequestHandlerClass khi khởi tạo, trong đó mô-đun này cung cấp ba biến thể khác nhau:

class http.server.BaseHTTPRequestHandler(request, client_address, server)

Lớp này được sử dụng để xử lý các yêu cầu HTTP đến máy chủ. Bản thân nó không thể đáp ứng bất kỳ yêu cầu HTTP thực tế nào; nó phải được phân lớp con để xử lý từng phương thức yêu cầu (ví dụ: 'GET' hoặc 'POST'). BaseHTTPRequestHandler cung cấp một số biến lớp và phiên bản cũng như các phương thức để các lớp con sử dụng.

Trình xử lý sẽ phân tích yêu cầu và tiêu đề, sau đó gọi một phương thức cụ thể cho loại yêu cầu. Tên phương thức được xây dựng từ yêu cầu. Ví dụ: đối với phương thức yêu cầu SPAM, phương thức do_SPAM() sẽ được gọi mà không có đối số. Tất cả thông tin liên quan được lưu trữ trong các biến thể hiện của trình xử lý. Các lớp con không cần ghi đè hoặc mở rộng phương thức __init__().

BaseHTTPRequestHandler có các biến thể hiện sau:

client_address

Chứa một bộ có dạng (host, port) đề cập đến địa chỉ của khách hàng.

server

Chứa phiên bản máy chủ.

close_connection

Boolean phải được đặt trước khi handle_one_request() trả về, cho biết liệu có thể mong đợi một yêu cầu khác hay không hoặc liệu kết nối có nên bị tắt hay không.

requestline

Chứa chuỗi biểu diễn của dòng yêu cầu HTTP. Việc kết thúc CRLF bị loại bỏ. Thuộc tính này phải được đặt bởi handle_one_request(). Nếu không có dòng yêu cầu hợp lệ nào được xử lý thì nó sẽ được đặt thành chuỗi trống.

command

Chứa lệnh (loại yêu cầu). Ví dụ: 'GET'.

path

Chứa đường dẫn yêu cầu. Nếu có thành phần truy vấn của URL thì path sẽ bao gồm truy vấn đó. Sử dụng thuật ngữ RFC 3986, path ở đây bao gồm hier-partquery.

request_version

Chứa chuỗi phiên bản từ yêu cầu. Ví dụ: 'HTTP/1.0'.

headers

Giữ một thể hiện của lớp được chỉ định bởi biến lớp MessageClass. Phiên bản này phân tích cú pháp và quản lý các tiêu đề trong yêu cầu HTTP. Hàm parse_headers() từ http.client được sử dụng để phân tích các tiêu đề và nó yêu cầu yêu cầu HTTP cung cấp tiêu đề kiểu RFC 5322 hợp lệ.

rfile

Luồng đầu vào io.BufferedIOBase, sẵn sàng đọc từ đầu dữ liệu đầu vào tùy chọn.

wfile

Chứa luồng đầu ra để viết phản hồi cho máy khách. Phải tuân thủ đúng giao thức HTTP khi ghi vào luồng này để đạt được khả năng tương tác thành công với các máy khách HTTP.

Thay đổi trong phiên bản 3.6: Đây là luồng io.BufferedIOBase.

BaseHTTPRequestHandler có các thuộc tính sau:

server_version

Chỉ định phiên bản phần mềm máy chủ. Bạn có thể muốn ghi đè lên điều này. Định dạng là nhiều chuỗi được phân tách bằng khoảng trắng, trong đó mỗi chuỗi có dạng name[/version]. Ví dụ: 'BaseHTTP/0.2'.

sys_version

Chứa phiên bản hệ thống Python, ở dạng có thể sử dụng được bằng phương thức version_string và biến lớp server_version. Ví dụ: 'Python/1.4'.

error_message_format

Chỉ định một chuỗi định dạng sẽ được phương thức send_error() sử dụng để xây dựng phản hồi lỗi cho máy khách. Chuỗi này được điền theo mặc định với các biến từ responses dựa trên mã trạng thái được chuyển tới send_error().

error_content_type

Chỉ định tiêu đề HTTP Loại nội dung của các phản hồi lỗi được gửi tới máy khách. Giá trị mặc định là 'text/html'.

protocol_version

Chỉ định phiên bản HTTP mà máy chủ tuân thủ. Nó được gửi dưới dạng phản hồi để cho khách hàng biết khả năng liên lạc của máy chủ đối với các yêu cầu trong tương lai. Nếu được đặt thành 'HTTP/1.1', máy chủ sẽ cho phép kết nối liên tục HTTP; tuy nhiên, máy chủ must của bạn sau đó sẽ bao gồm tiêu đề Content-Length chính xác (sử dụng send_header()) trong tất cả các phản hồi của nó tới máy khách. Để tương thích ngược, cài đặt mặc định là 'HTTP/1.0'.

MessageClass

Chỉ định một lớp giống như email.message.Message- để phân tích các tiêu đề HTTP. Thông thường, giá trị này không bị ghi đè và mặc định là http.client.HTTPMessage.

responses

Thuộc tính này chứa ánh xạ các số nguyên mã lỗi tới các bộ hai phần tử chứa một thông báo ngắn và dài. Ví dụ: {code: (shortmessage, longmessage)}. shortmessage thường được sử dụng làm phím message khi phản hồi lỗi và longmessage làm phím explain. Nó được sử dụng bởi các phương pháp send_response_only()send_error().

Một phiên bản BaseHTTPRequestHandler có các phương thức sau:

handle()

Gọi handle_one_request() một lần (hoặc, nếu kết nối liên tục được bật, nhiều lần) để xử lý các yêu cầu HTTP đến. Bạn không bao giờ cần phải ghi đè lên nó; thay vào đó, hãy triển khai các phương pháp do_*() thích hợp.

handle_one_request()

Phương thức này sẽ phân tích cú pháp và gửi yêu cầu đến phương thức do_*() thích hợp. Bạn không bao giờ cần phải ghi đè lên nó.

handle_expect_100()

Khi máy chủ tuân thủ HTTP/1.1 nhận được tiêu đề yêu cầu Expect: 100-continue, nó sẽ phản hồi lại bằng 100 Continue, theo sau là tiêu đề 200 OK. Phương thức này có thể bị ghi đè để gây ra lỗi nếu máy chủ không muốn máy khách tiếp tục. Ví dụ: máy chủ có thể chọn gửi 417 Expectation Failed làm tiêu đề phản hồi và return False.

Added in version 3.2.

send_error(code, message=None, explain=None)

Gửi và ghi lại phản hồi lỗi hoàn chỉnh cho khách hàng. Số code chỉ định mã lỗi HTTP, với message là mô tả lỗi tùy chọn, ngắn gọn, dễ đọc của con người. Đối số explain có thể được sử dụng để cung cấp thông tin chi tiết hơn về lỗi; nó sẽ được định dạng bằng thuộc tính error_message_format và được phát ra, sau một bộ tiêu đề hoàn chỉnh, làm nội dung phản hồi. Thuộc tính responses giữ các giá trị mặc định cho messageexplain sẽ được sử dụng nếu không có giá trị nào được cung cấp; đối với các mã không xác định, giá trị mặc định cho cả hai là chuỗi ???. Phần nội dung sẽ trống nếu phương thức là HEAD hoặc mã phản hồi là một trong những mã sau: 1xx, 204 No Content, 205 Reset Content, 304 Not Modified.

Thay đổi trong phiên bản 3.4: Phản hồi lỗi bao gồm tiêu đề Độ dài nội dung. Đã thêm đối số explain.

send_response(code, message=None)

Thêm tiêu đề phản hồi vào bộ đệm tiêu đề và ghi lại yêu cầu được chấp nhận. Dòng phản hồi HTTP được ghi vào bộ đệm bên trong, theo sau là các tiêu đề ServerDate. Các giá trị cho hai tiêu đề này được chọn tương ứng từ các phương thức version_string()date_time_string(). Nếu máy chủ không có ý định gửi bất kỳ tiêu đề nào khác bằng phương thức send_header() thì sau đó send_response() sẽ được gọi bằng lệnh gọi end_headers().

Thay đổi trong phiên bản 3.3: Các tiêu đề được lưu vào bộ đệm bên trong và end_headers() cần được gọi một cách rõ ràng.

send_header(keyword, value)

Thêm tiêu đề HTTP vào bộ đệm bên trong sẽ được ghi vào luồng đầu ra khi end_headers() hoặc flush_headers() được gọi. keyword phải chỉ định từ khóa tiêu đề, với value chỉ định giá trị của nó. Lưu ý rằng, sau khi thực hiện xong lệnh gọi send_header, end_headers() MUST BE được gọi để hoàn tất thao tác.

Phương pháp này không từ chối đầu vào chứa chuỗi CRLF.

Thay đổi trong phiên bản 3.2: Tiêu đề được lưu trữ trong bộ đệm nội bộ.

send_response_only(code, message=None)

Chỉ gửi tiêu đề phản hồi, được sử dụng cho các mục đích khi máy chủ gửi phản hồi 100 Continue đến máy khách. Các tiêu đề không được lưu vào bộ đệm và gửi trực tiếp luồng đầu ra. Nếu message không được chỉ định, thông báo HTTP tương ứng với phản hồi code sẽ được gửi.

Phương pháp này không từ chối message chứa các chuỗi CRLF.

Added in version 3.2.

end_headers()

Thêm một dòng trống (cho biết phần cuối của tiêu đề HTTP trong phản hồi) vào bộ đệm tiêu đề và gọi flush_headers().

Thay đổi trong phiên bản 3.2: Các tiêu đề đệm được ghi vào luồng đầu ra.

flush_headers()

Cuối cùng gửi các tiêu đề đến luồng đầu ra và xóa bộ đệm tiêu đề bên trong.

Added in version 3.3.

log_request(code='-', size='-')

Ghi lại một yêu cầu được chấp nhận (thành công). code phải chỉ định mã HTTP bằng số được liên kết với phản hồi. Nếu có sẵn kích thước của phản hồi thì nó sẽ được chuyển dưới dạng tham số size.

log_error(...)

Ghi lại lỗi khi yêu cầu không thể được thực hiện. Theo mặc định, nó chuyển thông báo tới log_message(), do đó, nó nhận các đối số giống nhau (format và các giá trị bổ sung).

log_message(format, ...)

Ghi một tin nhắn tùy ý vào sys.stderr. Điều này thường được ghi đè để tạo cơ chế ghi lỗi tùy chỉnh. Đối số format là chuỗi định dạng kiểu printf tiêu chuẩn, trong đó các đối số bổ sung cho log_message() được áp dụng làm đầu vào cho định dạng. Địa chỉ IP của máy khách và ngày giờ hiện tại được đặt trước cho mỗi tin nhắn được ghi lại.

version_string()

Trả về chuỗi phiên bản của phần mềm máy chủ. Đây là sự kết hợp của thuộc tính server_versionsys_version.

date_time_string(timestamp=None)

Trả về ngày và giờ do timestamp cung cấp (phải là None hoặc ở định dạng do time.time() trả về), được định dạng cho tiêu đề thư. Nếu timestamp bị bỏ qua, nó sẽ sử dụng ngày và giờ hiện tại.

Kết quả trông giống như 'Sun, 06 Nov 1994 08:49:37 GMT'.

log_date_time_string()

Trả về ngày và giờ hiện tại, được định dạng để ghi nhật ký.

address_string()

Trả về địa chỉ của khách hàng.

Thay đổi trong phiên bản 3.3: Trước đây, việc tra cứu tên đã được thực hiện. Để tránh sự chậm trễ trong việc phân giải tên, giờ đây nó luôn trả về địa chỉ IP.

class http.server.SimpleHTTPRequestHandler(request, client_address, server, directory=None)

Lớp này phục vụ các tệp từ thư mục directory trở xuống hoặc thư mục hiện tại nếu directory không được cung cấp, ánh xạ trực tiếp cấu trúc thư mục tới các yêu cầu HTTP.

Thay đổi trong phiên bản 3.7: Đã thêm tham số directory.

Thay đổi trong phiên bản 3.9: Tham số directory chấp nhận path-like object.

Rất nhiều công việc, chẳng hạn như phân tích cú pháp yêu cầu, được thực hiện bởi lớp cơ sở BaseHTTPRequestHandler. Lớp này thực hiện các hàm do_GET()do_HEAD().

Sau đây được định nghĩa là thuộc tính cấp lớp của SimpleHTTPRequestHandler:

server_version

Đây sẽ là "SimpleHTTP/" + __version__, trong đó __version__ được xác định ở cấp mô-đun.

extensions_map

Hậu tố ánh xạ từ điển có các loại MIME, chứa các phần ghi đè tùy chỉnh cho ánh xạ hệ thống mặc định. Ánh xạ được sử dụng không phân biệt chữ hoa chữ thường và do đó chỉ nên chứa các phím viết thường.

Thay đổi trong phiên bản 3.9: Từ điển này không còn chứa các ánh xạ hệ thống mặc định mà chỉ chứa các phần ghi đè.

Lớp SimpleHTTPRequestHandler định nghĩa các phương thức sau:

do_HEAD()

Phương thức này phục vụ loại yêu cầu 'HEAD': nó gửi các tiêu đề mà nó sẽ gửi cho yêu cầu GET tương đương. Xem phương pháp do_GET() để có giải thích đầy đủ hơn về các tiêu đề có thể có.

do_GET()

Yêu cầu được ánh xạ tới một tệp cục bộ bằng cách diễn giải yêu cầu dưới dạng đường dẫn liên quan đến thư mục làm việc hiện tại.

Nếu yêu cầu được ánh xạ tới một thư mục, thư mục đó sẽ được kiểm tra tệp có tên index.html hoặc index.htm (theo thứ tự đó). Nếu tìm thấy, nội dung của tập tin sẽ được trả về; nếu không thì danh sách thư mục sẽ được tạo bằng cách gọi phương thức list_directory(). Phương pháp này sử dụng os.listdir() để quét thư mục và trả về phản hồi lỗi 404 nếu listdir() không thành công.

Nếu yêu cầu được ánh xạ tới một tệp, nó sẽ được mở. Bất kỳ ngoại lệ OSError nào khi mở tệp được yêu cầu đều được ánh xạ tới lỗi 404, 'File not found'. Nếu có tiêu đề 'If-Modified-Since' trong yêu cầu và tệp không được sửa đổi sau thời gian này thì phản hồi 304, 'Not Modified' sẽ được gửi. Nếu không, loại nội dung sẽ được đoán bằng cách gọi phương thức guess_type(), phương thức này sử dụng biến extensions_map và nội dung tệp được trả về.

Tiêu đề 'Content-type:' với loại nội dung được đoán sẽ được xuất ra, theo sau là tiêu đề 'Content-Length:' với kích thước của tệp và tiêu đề 'Last-Modified:' với thời gian sửa đổi của tệp.

Sau đó là một dòng trống biểu thị sự kết thúc của các tiêu đề và sau đó nội dung của tệp sẽ được xuất ra.

Ví dụ về cách sử dụng, hãy xem cách triển khai hàm test trong Lib/http/server.py.

Thay đổi trong phiên bản 3.7: Hỗ trợ tiêu đề 'If-Modified-Since'.

Lớp SimpleHTTPRequestHandler có thể được sử dụng theo cách sau để tạo một máy chủ web rất cơ bản phục vụ các tệp liên quan đến thư mục hiện tại

nhập http.server
nhập khẩu máy chủ  cắm

PORT = 8000

Trình xử  = http.server.SimpleHTTPRequestHandler

với socketserver.TCPServer(("", PORT), Handler)  httpd:
    print("phục vụ tại cảng", PORT)
    httpd.serve_forever()

SimpleHTTPRequestHandler cũng có thể được phân lớp để nâng cao hành vi, chẳng hạn như sử dụng các tên tệp chỉ mục khác nhau bằng cách ghi đè thuộc tính lớp index_pages.

class http.server.CGIHTTPRequestHandler(request, client_address, server)

Lớp này được sử dụng để phục vụ các tệp hoặc đầu ra của tập lệnh CGI từ thư mục hiện tại trở xuống. Lưu ý rằng việc ánh xạ cấu trúc phân cấp HTTP sang cấu trúc thư mục cục bộ giống hệt như trong SimpleHTTPRequestHandler.

Ghi chú

Các tập lệnh CGI do lớp CGIHTTPRequestHandler chạy không thể thực thi chuyển hướng (mã HTTP 302), vì mã 200 (đầu ra tập lệnh theo sau) được gửi trước khi thực thi tập lệnh CGI. Điều này làm mất đi mã trạng thái.

Tuy nhiên, lớp sẽ chạy tập lệnh CGI, thay vì phân phát nó dưới dạng tệp, nếu nó đoán đó là tập lệnh CGI. Chỉ sử dụng CGI dựa trên thư mục --- cấu hình máy chủ phổ biến khác coi các phần mở rộng đặc biệt là biểu thị các tập lệnh CGI.

Các hàm do_GET()do_HEAD() được sửa đổi để chạy các tập lệnh CGI và phân phát đầu ra, thay vì phân phối các tệp, nếu yêu cầu dẫn đến một nơi nào đó bên dưới đường dẫn cgi_directories.

CGIHTTPRequestHandler xác định thành viên dữ liệu sau:

cgi_directories

Giá trị mặc định này là ['/cgi-bin', '/htbin'] và mô tả các thư mục được coi là chứa tập lệnh CGI.

Zz000zz định nghĩa phương thức sau:

do_POST()

Phương thức này phục vụ loại yêu cầu 'POST', chỉ được phép đối với tập lệnh CGI. Lỗi 501, "Chỉ có thể chuyển POST sang tập lệnh CGI", xuất hiện khi cố gắng chuyển POST sang url không phải CGI.

Lưu ý rằng tập lệnh CGI sẽ được chạy với UID của người dùng không ai vì lý do bảo mật. Các vấn đề với tập lệnh CGI sẽ được chuyển thành lỗi 403.

Không được dùng nữa kể từ phiên bản 3.13, sẽ bị xóa trong phiên bản 3.15: CGIHTTPRequestHandler sẽ bị xóa trong phiên bản 3.15. CGI đã không được coi là một cách tốt để làm mọi việc trong hơn một thập kỷ qua. Mã này đã không được bảo trì trong một thời gian và có rất ít ứng dụng thực tế. Việc giữ lại nó có thể dẫn đến security considerations hơn nữa.

Giao diện dòng lệnh

http.server cũng có thể được gọi trực tiếp bằng cách sử dụng khóa chuyển -m của trình thông dịch. Ví dụ sau minh họa cách phân phát các tệp liên quan đến thư mục hiện tại:

python -m http.server [OPTIONS] [cổng]

Các tùy chọn sau được chấp nhận:

port

Máy chủ nghe cổng 8000 theo mặc định. Giá trị mặc định có thể được ghi đè bằng cách chuyển số cổng mong muốn làm đối số:

python -m http.server 9000
-b, --bind <address>

Chỉ định một địa chỉ cụ thể mà nó sẽ liên kết. Cả hai địa chỉ IPv4 và IPv6 đều được hỗ trợ. Theo mặc định, máy chủ tự liên kết với tất cả các giao diện. Ví dụ: lệnh sau khiến máy chủ chỉ liên kết với localhost:

python -m http.server --bind 127.0.0.1

Added in version 3.4.

Thay đổi trong phiên bản 3.8: Hỗ trợ IPv6 trong tùy chọn --bind.

-d, --directory <dir>

Chỉ định một thư mục mà nó sẽ phục vụ các tập tin. Theo mặc định, máy chủ sử dụng thư mục hiện tại. Ví dụ: lệnh sau sử dụng một thư mục cụ thể:

python -m http.server --directory /tmp/

Added in version 3.7.

-p, --protocol <version>

Chỉ định phiên bản HTTP mà máy chủ tuân thủ. Theo mặc định, máy chủ tuân theo HTTP/1.0. Ví dụ: lệnh sau chạy máy chủ tuân thủ HTTP/1.1:

python -m http.server --protocol HTTP/1.1

Added in version 3.11.

--cgi

CGIHTTPRequestHandler có thể được kích hoạt trong dòng lệnh bằng cách chuyển tùy chọn --cgi

python -m http.server --cgi

Không được dùng nữa kể từ phiên bản 3.13, sẽ bị xóa trong phiên bản 3.15: Dòng lệnh http.server hỗ trợ --cgi đang bị xóa vì CGIHTTPRequestHandler đang bị xóa.

Cảnh báo

CGIHTTPRequestHandler và tùy chọn dòng lệnh --cgi không dành cho các máy khách không đáng tin cậy và có thể dễ bị khai thác. Luôn sử dụng trong môi trường an toàn.

--tls-cert

Chỉ định chuỗi chứng chỉ TLS cho các kết nối HTTPS:

python -m http.server --tls-cert fullchain.pem

Added in version 3.14.

--tls-key

Chỉ định tệp khóa riêng cho các kết nối HTTPS.

Tùy chọn này yêu cầu phải chỉ định --tls-cert.

Added in version 3.14.

--tls-password-file

Chỉ định tệp mật khẩu cho các khóa riêng được bảo vệ bằng mật khẩu:

python -m http.server \
       --tls-cert cert.pem \
       --tls-key key.pem \
       --tls-password-file pass.txt

Tùy chọn này yêu cầu phải chỉ định --tls-cert.

Added in version 3.14.

Cân nhắc về bảo mật

SimpleHTTPRequestHandler sẽ đi theo các liên kết tượng trưng khi xử lý các yêu cầu, điều này giúp các tệp bên ngoài thư mục được chỉ định có thể được phân phát.

Các phương thức BaseHTTPRequestHandler.send_header()BaseHTTPRequestHandler.send_response_only() giả sử đầu vào đã được chọn lọc và không thực hiện xác thực đầu vào, chẳng hạn như kiểm tra sự hiện diện của chuỗi CRLF. Đầu vào không đáng tin cậy có thể dẫn đến các cuộc tấn công tiêm tiêu đề HTTP.

Các phiên bản trước của Python không xóa các ký tự điều khiển khỏi thông điệp tường trình được phát tới stderr từ python -m http.server hoặc triển khai BaseHTTPRequestHandler .log_message mặc định. Điều này có thể cho phép các máy khách từ xa kết nối với máy chủ của bạn gửi mã kiểm soát bất chính đến thiết bị đầu cuối của bạn.

Thay đổi trong phiên bản 3.12: Các ký tự điều khiển được xóa trong nhật ký stderr.