Почему `wsgiref` не рекомендуется для production-использования в Python?

Ответ

wsgiref — это минимальная реализация WSGI-сервера, входящая в стандартную библиотеку Python. Она предназначена исключительно для целей разработки и тестирования, но не подходит для использования в production-среде из-за ряда критических ограничений:

  1. Однопоточность (Single-threaded): wsgiref обрабатывает запросы последовательно, один за другим. В production-среде это приводит к низкой производительности и неспособности обрабатывать несколько одновременных запросов, что делает его непригодным для реальных нагрузок.
  2. Низкая производительность: Отсутствие оптимизаций для высоких нагрузок, таких как эффективное управление соединениями, кэширование или балансировка нагрузки. Это делает его медленным и неэффективным для продакшн-приложений.
  3. Отсутствие функций для production: wsgiref не предоставляет таких важных функций, как управление процессами, мониторинг, ротация логов, обработка ошибок на уровне сервера или защита от DDoS-атак, которые необходимы для стабильной и безопасной работы в production.
  4. Безопасность: Не предназначен для обеспечения безопасности на уровне production, что может привести к уязвимостям при попытке его использования в реальных проектах.

Пример использования wsgiref (только для разработки):

from wsgiref.simple_server import make_server

def application(environ, start_response):
    # environ: словарь переменных окружения WSGI
    # start_response: функция для отправки статуса и заголовков
    status = '200 OK'
    headers = [('Content-type', 'text/plain; charset=utf-8')]
    start_response(status, headers)
    return [b"Hello, WSGI from wsgiref!"]

if __name__ == '__main__':
    with make_server('127.0.0.1', 8000, application) as httpd:
        print("Serving on port 8000...")
        print("Open http://127.0.0.1:8000/ in your browser")
        httpd.serve_forever()

Рекомендации для production:

Для развертывания WSGI-приложений в production следует использовать специализированные и оптимизированные WSGI-серверы, такие как Gunicorn, uWSGI или Waitress (для Windows), которые обеспечивают многопоточность/многопроцессность, высокую производительность, надежность и необходимые функции управления.

Ответ 18+ 🔞

А, слушай, про этот wsgiref... Ну, это такая штука, которая в Питоне из коробки идёт, типа «вот вам сервер, нате». Но это, блядь, чисто для разработки, чтобы локально потестить свой код, пока ты его пишешь. Представь себе детский велосипед с боковыми колёсиками — на нём по двору покататься можно, но на трассу «Формулы-1» выезжать — это, ёпта, самоубийство.

Почему? Да потому что он, сука, однопоточный. Это как если бы в кафе был один официант, который сначала полностью обслуживает одного клиента — от заказа до счёта, — и только потом подходит ко второму. Пока он там возится с первым, все остальные сидят и ебут мозг: «Ну чё там, блядь?». В продакшене, где запросов — овердохуища, это просто пиздец.

Итог по wsgiref:

  • Для разработки: Да, окей, удобно. Запустил, посмотрел, что работает, и всё.
  • Для продакшена: Ни в коем случае, нахуй. Это как пытаться вычерпать океан чайной ложкой — терпения ебать ноль, а толку — нихуя.

Вот, смотри, как им попользоваться, чтобы просто глянуть, работает ли твоё приложение:

from wsgiref.simple_server import make_server

def application(environ, start_response):
    # environ: словарь переменных окружения WSGI
    # start_response: функция для отправки статуса и заголовков
    status = '200 OK'
    headers = [('Content-type', 'text/plain; charset=utf-8')]
    start_response(status, headers)
    return [b"Hello, WSGI from wsgiref!"]

if __name__ == '__main__':
    with make_server('127.0.0.1', 8000, application) as httpd:
        print("Serving on port 8000...")
        print("Open http://127.0.0.1:8000/ in your browser")
        httpd.serve_forever()

Видишь? Всё просто. Запустил — и у тебя на локалхосте сервер крутится. Но это всё, на что он годен.

А что же тогда для боевых условий? А для этого есть нормальные, взрослые инструменты. Вот они, красавцы:

  • Gunicorn — как здоровенный мужик-грузчик, который может десять коробок одновременно таскать.
  • uWSGI — хитрая жопа, у которой настроек — дохуя, зато может всё.
  • Waitress — для тех, кто на Windows сидит, тоже неплохой вариант.

Вот их и ставь, когда дело дойдёт до выкладки на реальный сервер. А wsgiref — это просто игрушка, чтобы в песочнице поиграться.