Настройка локального сервера для сайта с помощью модуля http.server языка Python

Обратите внимание, сервер на http.server не имеет отношения к встроенному во фреймворк Flask, который мы используем для оценки работы нашего flask-приложения. В данном случае речь идет о проверке статичной версии сайта до того, как она будет выгружена на VPS.

Модуль http.server языка программирования Python позволяет создать сервер для обработки запросов по протоколу HTTP. Модуль имеет ряд ограничений, связанных с безопасностью, и поэтому не рекомендуется для использования на настоящих веб-серверах. Однако подходит для обеспечения работы простого сайта на локальном компьютере, где нет нужды устанавливать и настраивать Apache или другой серьезный программный сервер.

Ранее мы уже пользовались http.server из командной строки, чтобы посмотреть отдельную страничку. Без этого при абсолютной адресации не подключались файлы стилей и скриптов. Но чтобы проверить как работает статичный сайт целиком, придется внести изменения в работу сервера по-умолчанию. Иначе не будут работать ссылки и связанная с ними часть js-кода.

Необходимо сделать так, чтобы запросы по адресам без *.html направлялись на соответствующие им файлы с таковым расширением. Ниже приводится скрипт (возможно не идеальный вариант решения), который это делает по отношению к используемому в курсе шаблону сайта. Скрипт (назовем его local_server.py) надо запускать как отдельную программу из каталога статичного сайта, то есть он должен находиться в папке static.

# Скрипт для запуска веб-сервера только на локальном компьютере.
# Работает только под данную файловую структуру сайта и адресацию в коде HTML.

# 1. Запустите скрипт на выполнение
# 2. В браузере перейдите по адресу http://127.0.0.1:8000/

from http.server import HTTPServer, BaseHTTPRequestHandler


def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
    server_address = ('127.0.0.1', 8000)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()


class HttpGetHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        # super()
        if self.path[1:].partition('/')[0] == 'images':
            self.send_response(200, "OK")
            self.send_header("Content-Type", "image/png")
            self.end_headers()
            self.wfile.write(open(f'{self.path[1:]}', 'rb').read())
        elif self.path == '/styles/style.css':
            f = open(f'styles/style.css').read()
            self.send_response(200)
            self.send_header("Content-type", "text/css")
            self.end_headers()
            self.wfile.write(f.encode())
        elif self.path == '/scripts/script.js':
            f = open(f'scripts/script.js').read()
            self.send_response(200)
            self.send_header("Content-type", "text/javascript")
            self.end_headers()
            self.wfile.write(f.encode())
        elif self.path[1:].partition('/')[0] == 'fonts':
            f = open(f'{self.path[1:]}', 'rb').read()
            self.send_response(200)
            self.send_header("Content-type", "application/octet-stream")
            self.end_headers()
            self.wfile.write(f)
        elif self.path.find('.') == -1:  # else:
            if self.path == '/':
                f = open(f'index.html').read()
            else:
                f = open(f'{self.path[1:]}.html').read()
            self.send_response(200)
            self.send_header("Content-type", "text/html")
            self.end_headers()
            self.wfile.write(f.encode())


run(handler_class=HttpGetHandler)

Flask для начинающих




Все разделы сайта