Итак, господа программисты, если вам вдруг приспичило разрабатывать динамические странички при помощи Python, вам необязательно ставить какие-либо фреймворки. Конечно, многие советуют пользоваться фреймворками, но, когда вам нужно быстро написать код и не заморачиваться с изучением функций и прочих их особенностей, вы можете подключить к старому доброму Апачу mod_python. Делается это так.

Сначала скачиваем модуль. Скачать можно отсюда. О том, как компилировать модуль, можно почитать здесь. Я не буду заострять на этом внимание, тем более что этот процесс достаточно стандартен. Возьмем простой случай на примере Debian/Ubuntu — пакет для Apache 2 можно подтянуть вот так:

$ sudo apt-get install libapache2-mod-python

Теперь нам надо сконфигурировать Apache, для того, чтобы он обрабатывал скрипты Python. Заранее скажу, в результате мы получим обработку скриптов по аналогии со скриптами PHP, обрабатывающимися через mod_php — т.е. положили файлик в нужную нам директорию и обратились к нему из браузера. Для этого в /etc/apache2/sites-available найдем файл с конфигурацией для нашего сайта. В простейшем случае — по умолчанию — это файл default. В нем написано что-то типа:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<VirtualHost *:80>
     ServerAdmin webmaster@localhost
     DocumentRoot /var/www
     <Directory />
         Options FollowSymLinks
         AllowOverride All
     </Directory>
     <Directory /var/www/>
         Options Indexes FollowSymLinks MultiViews
         AllowOverride All
         Order allow,deny
         allow from all
     </Directory>
     ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
     <Directory "/usr/lib/cgi-bin">
         AllowOverride None
         Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
         Order allow,deny
         Allow from all
     </Directory>

     ErrorLog /var/log/apache2/error.log

     # Possible values include: debug, info, notice, warn, error, crit,
     # alert, emerg.
     LogLevel warn

     CustomLog /var/log/apache2/access.log combined

     Alias /doc/ "/usr/share/doc/"
     <Directory "/usr/share/doc/">
         Options Indexes MultiViews FollowSymLinks
         AllowOverride None
         Order deny,allow
         Deny from all
         Allow from 127.0.0.0/255.0.0.0 ::1/128
     </Directory>
</VirtualHost>

Находим в нем блок <Directory></Directory>, содержащий описание той директории, в которой мы хотим запускать наши скрипты, или создаем такой блок если его нет. В моем случае мне захотелось, чтобы скрипты запускались из корневой директории веб-сервера и во всех вложенных в нее директориях. Я нашел блок

<Directory /var/www/>
...
</Directory>

…и добавил в него следующие строки:

AddHandler mod_python .psp
PythonHandler mod_python.psp
PythonDebug On

AddHandler — директива, при помощи которой мы назначаем нужное нам расширение файла нужному нам обработчику, в данном случае мы назначили типу файла “.psp” (с таким расширением у нас будут сохраняться скрипты python) обработчику mod_python.

PythonHandler — директива, позволяющая запускать скрипты в разных режимах. Например, значение mod_python.psp даст нам обработку скриптов такую, какую мы хотим, а mod_python.cgihandler будет запускать скрипт Python как CGI-приложение. Для второго варианта понадобится настроить Perl.

PythonDebug — если директива прописана с параметром On, то вы, при дописывании к URL скрипта символ “_” (подчёркивание), получите исходный код скрипта и много другой информации, которую можно использовать при дебаггинге скрипта. У меня пока данная директива не отрабатывает, буду искать решение проблемы.

Далее нам, необходимо подключить сам модуль. Делаем так:

$ sudo a2enmod

Запустится программка для включения модулей Apache, вам в консоли будет предложен список доступных, еще не подключенных модулей. В нем должен быть модуль с названием python. Пишем программке “python” и всё, теперь нам остаётся перезапустить Apache и протестировать работу скрипта:

$ sudo apache2ctl restart

или

$ sudo /etc/init.d/apache2 restart

Тестируем скрипт:

Работа скрипта Python через Apache 2 и mod_python

Замечу, что стандартный синтаксис в psp-обработчике не прокатит, т.е. строки

#!/usr/bin/env python

…быть не должно, в скрипте должны присутствовать соответствующие теги <% %> (есть и другие, подробнее тут), в скрипте для PSP могут присутствовать HTML-теги в любом месте скрипта и, соответственно, консольные скрипты мы через браузер обработать не сможем. Есть мысль, что скрипты для работы и через Apache и через консоль, надо выполнять как CGI-приложение. Но это я пока не проверял.