Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Встроенный веб-сервер Python: Веб-разработка (Flask)

В стандартной библиотеке Python есть встроенный WSGI-сервер — wsgiref. На практике чаще используются gunicorn, uWSGI и другие серверы, но функционала встроенного нам хватит для обучающих целей.

Создадим модуль example.py. Это будет минимальное веб-приложение, которое будет возвращать текущее время:

from datetime import datetime

def app(environ, start_response):
    time = datetime.now()
    data = bytes(f'The time is {time:%H:%M:%S}', 'utf-8')
    start_response("200 OK", [
        ("Content-Type", "text/plain"),
        ("Content-Length", str(len(data)))
    ])
    return [data]

Теперь создадим веб-сервер в модуле server.py. Импортируем из библиотеки wsgiref функцию make_server(), она принимает параметрами адрес хоста (если он указан как '', то будет использован localhost), порт и приложение, а возвращает экземпляр сервера. Дальше нам нужно лишь вызвать метод .serve_forever(), чтобы наш сервер постоянно обслуживал запросы пока мы принудительно не завершим его процесс.

from wsgiref.simple_server import make_server
from example import app

def server(wsgi_app):
    serverd = make_server('', 8000, wsgi_app)
    print("Serving HTTP on port 8000...")
    serverd.serve_forever()


if __name__ == '__main__':
    server(app)

Запуститим веб-сервер.

python3 -m server

Serving HTTP on port 8000...

После того как сервер будет запущен, он полностью забирает управление. Вкладка терминала больше не доступна для ввода команд. В отличие от обычных скриптов, которые выполняют свою задачу и заканчиваются, веб-сервера должны слушать порт непрерывно и сразу реагировать на входящие соединения. Поэтому однажды запустив сервер продолжит работать до тех пор, пока его не остановят. Остановить сервер можно, набрав Ctrl-C.

Такой способ запуска удобен в разработке, но в реальном окружении сервера запускают в виде демонов. Демон — процесс операционной системы, работающий в фоне.

Если в это время попытаться запустить еще один веб-сервер в соседней вкладке на том же порту, то запуск завершится с такой ошибкой:

OSError: [Errno 98] Address already in use

В своей программистской жизни вы встретитесь с этой ошибкой не раз. Она означает, что какой-то процесс занял соответствующий порт (в данном случае 8000). В такой ситуации нужно либо остановить процесс который вам мешает, либо стартовать на другом порту.

Посмотреть какой процесс занял порт 8000 можно командой ss -ltnup 'sport = :8000'

После этого откройте браузер и введите http://localhost:8000. На экран выведется текущее время. В терминале, где запущен веб-сервер, появятся записи (лог), показывающие входящие запросы.

127.0.0.1 - - [08/Sep/2022 14:08:39] "GET / HTTP/1.1" 200 20
127.0.0.1 - - [08/Sep/2022 14:08:44] "GET / HTTP/1.1" 200 20
127.0.0.1 - - [08/Sep/2022 14:08:45] "GET / HTTP/1.1" 200 20
127.0.0.1 - - [08/Sep/2022 14:08:45] "GET / HTTP/1.1" 200 20

Теперь снова откроем файл example.py и изменим строчку, чтобы выводить еще и сегодняшний месяц и день — data = bytes(f'The time is {time:%b %d %H:%M:%S}', 'utf-8'). Выполните f5 в браузере, и вы увидите, что изменения не применились. Так как сервер загружает наш модуль единожды и на каждый запрос лишь запускает переданную в него функцию, то чтобы применились изменения, нужно перезапустить сервер. Со многими веб-фреймворками поставляется development сервер, который работает в режиме auto-reload, то есть перезагружается при каждом изменении кода. Но в production режиме нужно перезагружать вручную.


Самостоятельная работа

  1. Повторите все действия из этого урока

Дополнительные материалы

  1. Встроенный веб-сервер
  2. Демон

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
с нуля
Разработка веб-приложений на Django
1 декабря 10 месяцев

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и соглашаетесь с «Условиями использования»

Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу