Рубрики
Без рубрики

Объяснение приложений WSGI и Python

WSGI – одна из концепций, которые вы читаете, когда начинаете разработать свой веб -проект Python. Однако … Tagged с Python, WebDev, Django, Server.

WSGI – одна из концепций, которые вы читаете, когда начинаете разработать свой веб -проект Python. Однако широко используемая концепция, может быть довольно сложно понять, когда вы читаете ее первые пару раз. Эта статья ответит на следующие вопросы

  • Что такое WSGI?
  • Почему был создан WSGI?
  • Как WSGI помогает нам, когда мы развертываем наши веб -проекты Python?

Определение

WSGI означает интерфейс шлюза веб -сервера, это стандарт, который определяет правила, за которыми следуют серверы приложений, такие как стрелобчатая часть, и фреймворки, которые мы используем для разработки наших приложений, таких как Django.

История

Когда Python стал популярным в качестве языка программирования, многие разработчики хотели использовать его для выдающегося веб -мира, пока в этом доминировал PHP. Чтобы использовать код Python на сервере, сообщество разработало модуль Apache под названием mod_python.

Однако Mod_python был популярен, появилось много уязвимостей и ошибок. Наконец, сообщество решило создать официальную спецификацию.

Эта спецификация была определена в предложениях PEP 0333 и PEP 3333 Анкет Цели этих предложений состояло в том, чтобы создать стандартное решение безопасного и безопасного решения, но достаточно гибкого, чтобы их можно было использовать с различными технологиями Python.

Найденным решением был WSGI.

Теория

Этот стандарт определил, как сервер приложений должен загружать приложение Python и работать вместе. Это позволило разработчикам создавать различные серверы приложений, которые могут работать с каким -либо приложением Python, если они соответствуют спецификации WSGI.

Диаграмма коммуникации веб -проекта Python

На картинке выше показано, как наше приложение WSGI Server и наш Приложение Python общаться друг с другом. Они полностью отделены, им не нужно знать друг друга, им нужно только удовлетворить стандарт WSGI.

Сервер WSGI отвечает за обработку информации, полученной периферийными устройствами нашего сервера (он может использовать сетевой розетку, файл, stdin …). Входящая информация будет адаптирована к стандарту WSGI, сервер загрузит наше приложение Python и отправит ему информацию. Это станет Ворота нашего приложения.

Приложение Python Нужно понять, как сервер WSGI будет загружать его, как он получит информацию и как его нужно будет возвращать. Наше приложение будет загружаться в соответствующем способе загрузки сервера и возможности общаться с ним.

Код

Теория в порядке, но как разработчики нам нравится видеть теорию, переведенную в код. Примерами ниже являются сервер приложений (Funicorn) и приложение Python (Fango), Ни одна из этих программ не готова к производству, не тестируется и может содержать ошибки . Они являются примерами, чтобы проиллюстрировать, как стандарт работает в целом.

Чтобы стать легче понять, реализованы только самые важные части стандарта.

Сервер приложений

# Sibling Fake of gunicorn
import os
import sys
from typing import List, Tuple


class Funicorn:

    def __init__(self, app_path: str):
        self.application = load_application(application_path)
        self.buffer_output = sys.stdout.buffer
        self.set_environ()

    def set_environ(self):
        self.environ = {**os.environ}

        self.environ['wsgi.input'] = sys.stdin.buffer
        self.environ['wsgi.errors'] = sys.stderr.buffer

    def write(self, data: bytes):
        self.buffer_output.write(data)

    def write_headers(self, status, headers: List[Tuple(str, str)]):
        self.write(f'Status: {status}\r\n'.encode())

        for hkey, hvalue in headers:
            self.write(f'{hkey}: {hvalue}\r\n'.encode())

            self.write('\r\n'.encode())

    def start_response(self, status, response_headers: List[Tuple(str, str)], **kwargs):
        self.write_headers(status, response_headers)

    def finish(self):
        self.buffer_output.flush()

    def run(self):
        response_body = self.application({**self.environ}, self.start_response)
        self.write(response_body)


if __name__ == 'main':
    application_path = 'path_to_fango.app'
    funicorn = Funicorn(application_path)

    funicorn.run()

Гист – Funicorn

Приложение Python

# Sibling fake of Django
from typing import Dict, Any


class Fango:

    def __call__(environ: Dict[str, Any], start_response) -> bytes:
        HELLO = b'Hello!'
        status = '200 OK'
        response_headers = [('Content-type', 'text/plain')]
        start_response(status, response_headers)
        return HELLO


app = Fango()

Гист – Фанго

Вывод

Стандарт WSGI увеличивает количество библиотек, созданных сообществом Python в областях веб -приложений, что позволяет разработчикам отделить технологию сервера от приложения Python изолированным образом.

Разработчики структуры, которым не нужно было беспокоиться о том, как справиться с подключением к сокетам, запросам на доход или одновременных соединений, смогли потратить время на создание многих рамок питона, любимых многими из нас, как Джанго, Фласка, Пирамида.. и так далее.

Если вы хотите глубже погрузиться в то, как работает WSGI, я бы порекомендовал вам перейти непосредственно к предложениям PEP 0333 и PEP 3333 , они содержит всю спецификацию.

Оригинал: “https://dev.to/juanbenitopr/explaining-wsgi-and-python-applications-14aa”