Python Glossary English

Python 3.0+http.serverпонятие

http.server.BaseHTTPRequestHandler

обработчики запросов

Базовый класс обработчика HTTP-запроса: разбирает строку запроса и заголовки и вызывает ваш метод do_GET, do_POST и т. д.

Синтаксис

class Handler(BaseHTTPRequestHandler):
    def do_GET(self): ...

На каждый запрос создаётся новый объект, так что состояние между запросами в self не хранится — его кладут на self.server. Метода do_<МЕТОД> нет — клиент получит 501. Порядок обязателен: send_response(), send_header(), end_headers() — до end_headers() заголовки лежат в буфере; в wfile пишут байты. Тело запроса читают ровно на Content-Length: rfile.read() без размера ждёт закрытия соединения и висит. По умолчанию protocol_version — 'HTTP/1.0'.

Примеры

import io
from http.server import BaseHTTPRequestHandler
class Hello(BaseHTTPRequestHandler):
    def setup(self):  # вместо сокета — байты в памяти
        self.rfile = io.BytesIO(self.request)
        self.wfile = io.BytesIO()
    def log_message(self, format, *args):
        pass
    def finish(self):
        head, _, body = self.wfile.getvalue().partition(b'\r\n\r\n')
        print(head.split(b'\r\n')[0].decode(), body[:20])
    def do_GET(self):
        body = f'path={self.path}'.encode()
        self.send_response(200)
        self.send_header('Content-Length', str(len(body)))
        self.end_headers()
        self.wfile.write(body)
Hello(b'GET /hi?x=1 HTTP/1.1\r\n\r\n', ('127.0.0.1', 5000), None)
# → HTTP/1.0 200 OK b'path=/hi?x=1'
Hello(b'POST /hi HTTP/1.1\r\n\r\n', ('127.0.0.1', 5000), None)
# → HTTP/1.0 501 Unsupported method ('POST')

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности