Запуск web странички на Python 3 с помощью http.server

Недавно мне понадобилось запустить очень простую веб-страничку с несложной логикой на серверной стороне, а трогать старый добрый PHP совсем не хотелось. Без долгих колебаний, я решил, что попробую поднять вебсервер на Python 3 и заодно разобраться, насколько просто это можно сделать. Немного кода в ярких цветах Сразу оговорюсь, что для более-менее толковых проектов надо бы использовать хорошие фреймворки вроде Flask или Django но мне хотелось простоты и я начал искать, какие возможности мне предоставит Питон.

Хороший пример я нашёл в блоге Daan Lenaerts, его и постараюсь пересказать.

Весь код, необходимый для запуска нашего маленького веб-сервера с лёгкостью уместится на одном экране. Давайте сразу на него взглянем, а потом разберёмся, как он работает:

#!/usr/bin/env python3

from http.server import BaseHTTPRequestHandler, HTTPServer

# HTTPRequestHandler class
class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):

  # когда от клиента придёт GET запрос, отдадим ему нашу страницу
  def do_GET(self):
        # Отправляем код 200 (ОК)
        self.send_response(200)

        # Теперь очередь за заголовками
        self.send_header('Content-type','text/html')
        self.end_headers()

        # И теперь - сам контент
        message = "Hello world!"

        # Пишем содержимое страницы и кодируем его в UTF-8
        self.wfile.write(bytes(message, "utf8"))
        return


def run():  
  print('Запускаем сервер...')

  # Настройки сервера
  # Укажите правильный IP и порт для запуска вебсервера, но для порта 80 нужны root-права
  server_address = ('127.0.0.1', 80)
  httpd = HTTPServer(server_address, testHTTPServer_RequestHandler)
  print('Сервер работает!')
  httpd.serve_forever()

run()  

Теперь давайте это разбирать:

BaseHTTPRequestHandler - это класс, который используется для обработки поступающих на сервер HTTP запросов. Сам по себе он не умеет на них отвечать, но предоставляет несколько важных и полезных методов, например: handle_one_request() - разбирает запрос и запускает соответствующий его типу метод. Так, для запроса, у которого указан тип SPAM, он будет пытаться запустить метод do_SPAM

Логично будет и то, что метод do_GET вызывается автоматически, благодаря наследованию от BaseHTTPRequestHandler, когда поступает GET-запрос. Если вы хотите отвечать ещё и на POST-запросы, то можете сделать то же самое с помощью do_POST, например.

Официальная документация на тему

По-большому счёту, на этом месте можно уже переставать читать и идти пробовать поднять плохенький, но свой веб-сервер на Python 3.

Только не забудьте поправить переменную server_address так, чтобы она соответствовала Вашим требованиям, но знайте - если укажете порт 80 (стандартный для веб-серверов) и запустите без root-прав - получите PermissionError: [Errno 13] Permission denied