Знаете ли вы о WSGI и ASGI и когда они нужны для

11 марта 2025 г.Код на салфетке
Знаете ли вы о WSGI и ASGI и когда они нужны для | 🔁 Новости из телеграм - Ghostbase News

Знаете ли вы о WSGI и ASGI и когда они нужны для масштабируемых веб-приложений?

В экосистеме Python существуют два основных интерфейса для веб-серверов: WSGI (Web Server Gateway Interface) и ASGI (Asynchronous Server Gateway Interface).

Простой WSGI-сервер (синхронный)

def wsgi_app(environ, start_response):

"""Простое WSGI-приложение"""

status = '200 OK'

headers = [('Content-Type', 'text/plain')]

start_response(status, headers)



# Это блокирующая операция!

import time

time.sleep(0.1)  # Имитация блокирующей задачи (БД, файловая система)



return [b"Hello, WSGI World!"]

Запуск WSGI-сервера

from wsgiref.simple_server import make_server

httpd = make_server('', 8000, wsgi_app)

httpd.serve_forever()

Простой ASGI-сервер (асинхронный)

async def asgi_app(scope, receive, send):

"""Простое ASGI-приложение"""

assert scope['type'] == 'http'



# Асинхронная операция не блокирует сервер

import asyncio

await asyncio.sleep(0.1)  # Имитация асинхронной задачи (БД, HTTP)



await send({

    'type': 'http.response.start',

    'status': 200,

    'headers': [

        [b'content-type', b'text/plain'],

    ],

})



await send({

    'type': 'http.response.body',

    'body': b"Hello, ASGI World!",

})

Запуск ASGI-сервера с uvicorn

pip install uvicorn

uvicorn asgi_example:asgi_app

WSGI:

  • Синхронный (блокирующий) интерфейс

  • Только для HTTP

  • Проще в настройке и отладке

  • Используется в Flask, Django (до версии 3.0), WSGI-серверами (Gunicorn, uWSGI)

  • Хорошо подходит для традиционных веб-приложений

ASGI:

  • Асинхронный (неблокирующий) интерфейс

  • Поддерживает HTTP, WebSockets, HTTP/2

  • Подходит для реактивных приложений и длительных соединений

  • Используется в FastAPI, Starlette, Django 3.0+, ASGI-серверами (Uvicorn, Daphne)

  • Лучше масштабируется при большом количестве одновременных соединений