Работа с веб отличается от работы с не-веб одной простой вещью:
- сервер (апач, нжинкс и т.п.) получает запрос (а запрос - это строка) от браузера,
- сервер обращается к приложению, передавая ему эту строку как аргумент,
- приложение возвращает результат (тоже строку),
- сервер отдаёт полученную строку в браузер.
Конкретно для питона такое подключение скрипта к веб-серверу решается с помощью
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>
(Обсуждается
здесь.)