> **Источник:** https://python-all.ru/2.7/library/cgihttpserver.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 20.20. [`CGIHTTPServer`](https://python-all.ru/2.7/library/cgihttpserver.html#module-CGIHTTPServer) – обработчик HTTP-запросов с поддержкой CGI

> **Примечание**
>
> Модуль [`CGIHTTPServer`](https://python-all.ru/2.7/library/cgihttpserver.html#module-CGIHTTPServer) был объединён с `http.server` в Python 3. Инструмент [2to3](https://python-all.ru/2.7/glossary.html#term-2to3) автоматически адаптирует импорты при преобразовании исходного кода в Python 3.

Модуль [`CGIHTTPServer`](https://python-all.ru/2.7/library/cgihttpserver.html#module-CGIHTTPServer) определяет класс обработчика запросов, интерфейс совместимый с [`BaseHTTPServer.BaseHTTPRequestHandler`](https://python-all.ru/2.7/library/basehttpserver.html#BaseHTTPServer.BaseHTTPRequestHandler), и наследует поведение от [`SimpleHTTPServer.SimpleHTTPRequestHandler`](https://python-all.ru/2.7/library/simplehttpserver.html#SimpleHTTPServer.SimpleHTTPRequestHandler), но также может запускать CGI-скрипты.

> **Примечание**
>
> Этот модуль может запускать CGI-скрипты в системах Unix и Windows.

> **Примечание**
>
> CGI-скрипты, запускаемые классом [`CGIHTTPRequestHandler`](https://python-all.ru/2.7/library/cgihttpserver.html#CGIHTTPServer.CGIHTTPRequestHandler), не могут выполнять перенаправления (HTTP-код 302), поскольку код 200 (вывод скрипта будет отправлен) отправляется до выполнения CGI-скрипта. Это предотвращает установку другого кода состояния.

Модуль [`CGIHTTPServer`](https://python-all.ru/2.7/library/cgihttpserver.html#module-CGIHTTPServer) определяет следующий класс:

#### `class CGIHTTPServer.CGIHTTPRequestHandler(request, client_address, server)`

Этот класс используется для обслуживания как файлов, так и вывода CGI-скриптов из текущего каталога и всех подкаталогов. Обратите внимание, что отображение иерархической структуры HTTP на локальную структуру каталогов в точности такое же, как в [`SimpleHTTPServer.SimpleHTTPRequestHandler`](https://python-all.ru/2.7/library/simplehttpserver.html#SimpleHTTPServer.SimpleHTTPRequestHandler).

Однако класс будет запускать CGI-скрипт вместо его обслуживания как файла, если он определяет его как CGI-скрипт. Используется только CGI на основе каталогов – другая распространенная конфигурация сервера – обрабатывать специальные расширения как обозначающие CGI-скрипты.

Функции `do_GET()` и `do_HEAD()` изменены таким образом, чтобы запускать CGI-скрипты и выдавать их результат вместо отдачи файлов, если запрос ведёт в каталог, расположенный ниже пути `cgi_directories`.

Класс [`CGIHTTPRequestHandler`](https://python-all.ru/2.7/library/cgihttpserver.html#CGIHTTPServer.CGIHTTPRequestHandler) определяет следующий элемент данных:

#### `cgi_directories`

По умолчанию имеет значение `['/cgi-bin', '/htbin']` и описывает каталоги, которые следует считать содержащими CGI-скрипты.

[`CGIHTTPRequestHandler`](https://python-all.ru/2.7/library/cgihttpserver.html#CGIHTTPServer.CGIHTTPRequestHandler) определяет следующие методы:

#### `do_POST()`

Этот метод обслуживает запросы типа `'POST'`, разрешённые только для CGI- скриптов. При попытке выполнить POST на не-CGI URL выводится ошибка 501: «Can only POST to CGI scripts».

Обратите внимание, что CGI-скрипты будут запускаться с UID пользователя nobody по соображениям безопасности. Проблемы с CGI-скриптом будут приводить к ошибке 403.

Пример использования см. в реализации функции [`test()`](https://python-all.ru/2.7/library/test.html#module-test).

> **См. также**
>
> **Модуль [`BaseHTTPServer`](https://python-all.ru/2.7/library/basehttpserver.html#module-BaseHTTPServer)**
>
> Реализация базового класса для веб-сервера и обработчика запросов.
