WSGI в двух словах

Работа с веб отличается от работы с не-веб одной простой вещью:
— сервер (апач, нжинкс и т.п.) получает запрос (а запрос — это строка) от браузера,
— сервер обращается к приложению, передавая ему эту строку как аргумент,
— приложение возвращает результат (тоже строку),
— сервер отдаёт полученную строку в браузер.
Конкретно для питона такое подключение скрипта к веб-серверу решается с помощью WSGI.


Как это сделать. В настройках веб-сервера вы указываете документ_рут вашего приложения и скрипт с колбэком. Конфигурация для апача:

<VirtualHost *:80>
     ServerName mysite
     DocumentRoot /var/sites/mysite/public
     WSGIScriptAlias / /var/sites/mysite/script.wsgi
 </VirtualHost>

Колбэк — это функция в глобальном неймспейсе, называющаяся всегда application. Выглядит она примерно так:

def application(environ, start_response):
    status = '200 OK' 
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

Когда апач получит запрос — он через wsgi запустит функцию application, а полученный от неё результат выдаст в ответ на запрос.

Это всё, что нужно для понимания, как обрабатывать http-запросы из питона. Всякие джанги работают на этом же механизме.

Теперь неочевидный нюанс. Дело в том, что обычно апач в нормальном состоянии отдаёт статику как статику. А если подключить к нему wsgi — то wsgi начнёт перехватывать и запросы к статике тоже. В джанго такая ситуация решается через жопу (что доказывает, что джангодрочеры — альтернативномыслящие), а именно: предлагается создать поддомен для статики и раздавать её сервером без wsgi, нжиниксом каким-нибудь, либо отдавать статику скриптом. Оба варианта, мягко говоря, спорные. Я считаю намного лучше и гибче третий вариант:

<VirtualHost *:80>
     ServerName mysite
     DocumentRoot /var/sites/mysite/public
     RewriteEngine on
     RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
     RewriteRule (.*) /index.py/$1 [L,QSA,PT]
     WSGIScriptAlias /index.py /var/sites/mysite/script.wsgi
  </VirtualHost>

(Обсуждается здесь.)

Источник: https://toster.ru/q/52846

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *