Удобно php-шникам
— поставил какое-нибудь готовое LAMP
решение, написал что-то вроде
<?php echo 'Привет, мир!'; ?>
в файле index.php
и всё, готово
первое
веб-приложение.
Потом ребята
взрослеют, пытаются перейти на Python и...
ой, а как тут вывести текст? Как сделать
«хелло ворлд»?
Чтобы написать
веб-приложение на Python, надо освоить WSGI
- Web Server Gateway Interface.
Кому лень
читать, тот может сразу приступить к
практическим занятиям. Но читать все
равно придется, рано или поздно.
На практике
это выглядит так.
Берем Apache
httpd, в его конфиге пишем что-то вроде:
<VirtualHost *:80> ServerName www.allgis.org ServerAlias www.allgis.org WSGIScriptAlias "/pages" "/path/to/site/pages/asp.wsgi" <Directory "/path/to/site/pages"> DirectoryIndex index.html default.html Options Indexes FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> |
и, не забыв
подключить модуль mod_wsgi
aptitude install libapache2-mod-wsgi a2enmod wsgi
перезапускаем Апач
service apache2 restart
Это, как не
трудно догадаться, была начальная
настройка веб-сервера. Типа, подключили
обработчик Python скриптов.
Теперь надо
написать сам скрипт.
В нашем примере
это будет так:
nano /path/to/site/pages/asp.wsgi
#!/usr/bin/env python # -*- mode: python; coding: utf-8 -*- import os, sys def application(environ, start_response): """ A very simple WSGI application for tests http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide """ status = '200 OK' output = u'Привет Мир! \n environ: \n'.encode('utf-8') for x in sorted(environ.keys()): output += "'%s' : '%s' \n" % (x, environ[x]) response_headers = [('Content-type', 'text/plain; charset=utf-8'), ('Content-Length', str(len(output)))] start_response(status, response_headers) return [output] |
Вот и весь
«хелло ворлд». Кто не понял — идите,
занимайтесь php, вам еще рано двигаться
дальше.
Но это еще не
все. Вообще-то я тут хотел написать о
том, как использовать песочницы virtualenv
при подключении WSGI приложений к Apache
httpd.
Об этом много
написано тут
http://code.google.com/p/modwsgi/wiki/VirtualEnvironments
И, в принципе,
этого достаточно.
Но есть одна
особенность, про которую написано здесь
http://12factor.net/config
А именно:
конфигурацию (а расположение на диске
папки с песочницей virtualenv относится к
конфигурации) надо выносить из кода.
Желательно — в переменные окружения.
И тогда
получается вот что.
В коде пишем:
nano /path/to/site/pages/asp.wsgi
#!/usr/bin/env python # -*- mode: python; coding: utf-8 -*- import os, sys def application(environ, start_response): if sys.modules.get('mywebapppackage', '') == '': activate_this = environ.get('VIRTENV_ACTIVATE_SCRIPT', "/default/path/to/site/virtualenv/dir/env/bin/activate_this.py") execfile(activate_this, dict(__file__=activate_this)) from mywebapppackage.flaskappmodule import APP return APP(environ, start_response) |
где
mywebapppackage.flaskappmodule — это написанный нами
модуль Python с нужным веб приложением,
построенным используя Flask, к примеру.
А
VIRTENV_ACTIVATE_SCRIPT — это имя переменной,
заданной в конфигурации Apache httpd.
Задается
переменная примерно так:
<VirtualHost *:80> ServerName www.allgis.org ServerAlias www.allgis.org WSGIScriptAlias "/pages" "/path/to/site/pages/asp.wsgi" SetEnv VIRTENV_ACTIVATE_SCRIPT "/path/to/site/pages/venv/bin/activate_this.py" <Directory "/path/to/site/pages"> DirectoryIndex index.html default.html Options Indexes FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> |
И если применять
эту технику, то можно совершенно не
напрягаясь, один раз отконфигурировав
веб-сервера на машинах разработки,
тестов и продакшн, использовать на них
один и тот-же код приложения, вытягивая
его из git-репозитория разработки продукта.
Тема разработки
с использованием пакетирования и
virtualenv тут осталась за кадром. Об этом
можно почитать здесь:
original post http://vasnake.blogspot.com/2014/02/blog-post_4772.html
Комментариев нет:
Отправить комментарий