Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2014-03-11

визги

Удобно 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

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) Java (22) humor (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) Klaipeda (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) купи/продай (9) Photo (8) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)