PostgreSQL
coub
css
express.js
freeware
git
jquery
laravel
links
linux
macos
mysql
node.js
php
python
task1
ubuntu
vim
virtualbox
анекдот
игры
интересно
музыка
стихи
цитаты
python
task1
task1
Django + Gunicorn + virtualenv + nginx #2
November 29, 2013
Напишу ещё раз на всякий случай.
Я не настоящий сварщик! То есть не проф. python программист. Я только учусь!
Итого успехи у меня не большие к этому моменту. Я поиграл с flask-ом и поленившись всерьез добраться до SQLAlchemy взял Django как фреймворк пока. Пока это не было важно. Я хотел разобраться как устроена боевая серверная часть хотя бы на базовом уровне и кажется у меня получилось.
Суть примерно такая:
Теперь чуть больше порядка.
Я не настоящий сварщик! То есть не проф. python программист. Я только учусь!
Итого успехи у меня не большие к этому моменту. Я поиграл с flask-ом и поленившись всерьез добраться до SQLAlchemy взял Django как фреймворк пока. Пока это не было важно. Я хотел разобраться как устроена боевая серверная часть хотя бы на базовом уровне и кажется у меня получилось.
Суть примерно такая:
- Впереди стоит nginx который форвардит соединения для хоста на порт приложения
- За nginx стоит Gunicorn (Python WSGI HTTP Server)
- За Gunicorn уже само приложение на Django
- Все python компоненты, необходимые для работы приложения, собираются при помощи virtualenv + pip
Теперь чуть больше порядка.
- pip - это инструмент для установки и управления python-компонентами. То есть эта штука позволяет нам грубо говоря ставить/удалять/искать/создавать разные пакеты с указанной версией. Эдакий питоний apt-get или npm для node.js. Как он устанавливается и работает можно почитать на офсайте.
-
virtualenv - инструмент для создания "виртуальной среды" для выбранного приложения. По-простому говоря у вас на одном сервере живет несколько приложений которые требуют разные версии одного и того же python-компонента. Обязательно разные версии. Как быть, ведь глобально можно установить ровно одну версию. Тут как раз придет на помощь virtualenv. В общем тоже что и в node.js есть компоненты установленные глобально, а есть установленные специально под приложение и все это барахло можно контролировать. В разных доках и туториалах по python разработке умные дядьки настоятельно рекомендуют использовать virtualenv и я тут могу только с ними согласиться. Смысл очевиден. Ставится просто:
sudo pip install virtualenv
Базовое использование совсем не сложно# переходим в папку нашего проекта cd ~/project-folder # инициализируем вирт. среду (название среды может быть любым, у меня это ENV) virtualenv ENV # теперь внутри папки с нашим проектом будет создана папка ENV # с инициализированной виртуальной средой внутри # теперь активируем эту вирт. среду source ./ENV/bin/activate # обратите внимание строка приглашения bash будет дополнена названием среды # у меня в примере она выглядит вот так: (ENV)luke@tatuin:~/project-folder$ # теперь ставим в эту вирт среду нужные компоненты pip install Django pip install gunicorn pip install mysql-python # и так далее.. все что установлено можно посмотреть вот так pip list # для выхода из виртуальной среды нужно просто вызвать deactivate
В общем суть в том что virtualenv в активированном состоянии подменяет переменные в env (наберите в консоли env чтобы посмотреть текущие переменные окружения), отвечающие за размещение пакетов и бинарников, после деактивации все возвращается обратно, как было. - Как сделать болванку приложения на Django можно почитать на офсайте. Про это я сейчас писать ничего не буду, тут нет ничего необычного, все как в мануале. Будем считать что приложение у меня есть.
-
Сейчас у нас есть приложение и настроенная среда для приложения. Папка с приложением у меня сейчас выглядит вот так:
domain ENV manage.py manage.pyc requirements.txt run-dev.sh run-prod.sh static templates test1
ENV - папка с вирт. средой, domain - приложение проекта test1 (примерно так выглядит обычная структура django-приложения). Соответственно, чтобы запустить отладочную версию проекта достаточно запустить (при активированном virtualenv)python manage.py runserver
Ну и чтобы запустить боевую версию на gunicorn-e (при активированном virtualenv) делаем такgunicorn test1.wsgi:application -b 127.0.0.1:8800 --env FOO=VAL
Здесь мы биндим наше приложение на IP и порт. Через --env передаем переменную окружения (см. мануал по gunicorn) чтобы сообщить что-то приложению, что мы боевая версия например или номер генератора на котором будем работать, да что угодно в общем. Вообще запуск gunicorn можно отдельно конфигурировать в файл и читать все оттуда, это все есть на офсайте. В данном случае, для Django, запуск выглядит не совсем тривиально, с простыми приложениями это немного иначе выглядит. -
Ну и в конце nginx, через который мы завернем хост на наше приложение
server { listen 80; server_name lest1.loc; proxy_set_header Host $http_host; location / { proxy_pass http://127.0.0.1:8800; } }
На этом месте данных должно быть достаточно чтобы запустить приложение в боевом режиме. У Django ещё куча доп. внутренних настроек для отладки, но это уже другая история. -
Что осталось. Осталось понять как сохранять состояние среды окружения и как его восстанавливать обратно. Сохранить состояние можно в текстовый файл вот так
pip freeze > requirements.txt
Название файла может быть любым, по сути главное там формат. Загляните внутрь. Внутри будет содержимое видаDjango==1.6 MySQL-python==1.2.4 argparse==1.2.1 gunicorn==18.0 wsgiref==0.1.2
Теперь коммитим это в нашу систему контроля версий и когда нужно будет восстановить состояние проекта - создаем вирт. среду через virtualenv, активируем её и выполняем установку пакетов из сохраненного файла состояния вирт. среды. Все вместе будет выглядеть вот так:cd proj-folder virtualenv ENV source ./ENV/bin/activate pip install -r requirements.txt
Pip считает данные о зависимостях из текстовика и установит в вирт.среду все что нужно. Если будет нужно что-то скачать, то он конечно попробует скачать сам. Ну, тут уже все понятно. Пока это все. Надеюсь следующая пауза не будет длиннее.
sudo apt-get install python-dev sudo apt-get install libmysqlclient-dev
task1: начало #1
October 26, 2013
Дело было вечером делать было нечего. Решил затеять "проект" с целью осилить то, что так долго не могу собраться. Проект будет публичный, но на какую-либо популярность я не расчитываю, довести до финала планирую ради спортивного интереса, для себя.
Суть банальна и проста: от начала до конца реализовать некий законченный продукт на незнакомых технологиях. Сам продукт будет представлять собой 100500 по счету в мире веб тайм-трекер с блекджеком и гетерами. У меня есть несколько специфичных "идей по дизайну", но мелкие детали на этом этапе не так уж важны, здесь только крупными мазками что будет:
Про сервер наверное nginx с чем-то типа fcgi я пока не в курсе как эта сторона на питоне устроена вообще.
Писать буду по мере сил под этот тег. Репа будет на гитхабе, все как у нормальных людей.
Суть банальна и проста: от начала до конца реализовать некий законченный продукт на незнакомых технологиях. Сам продукт будет представлять собой 100500 по счету в мире веб тайм-трекер с блекджеком и гетерами. У меня есть несколько специфичных "идей по дизайну", но мелкие детали на этом этапе не так уж важны, здесь только крупными мазками что будет:
- Авторизация через социалки
- Проекты как очереди собственных тасков
- Создание тудушек ака тасков для себя в выбранной очереди (к таскам можно лепить файлы)
- Статусы решен / не решен только пока
- Тайм трекинг по таскам автоматический или ручной, надо подумать как именно трекать
- Возможность создать текстовый отчет за день или за какой-то период в днях (на что и сколько потрачено с тоталами)
- Python, Flask, SQLALchemy
- PostgreSQL
- Интерфейс одностраничный собранный на BACKBONE.JS
- Видимо jQuery и Bootstrap, правда я с ними знаком, но верстаю я коряво, а без jQuery не представляю как обеспечить кроссбраузерность, клиентсайдом я все же слаб. Иконки возьму тоже знакомые Font Awesome
Про сервер наверное nginx с чем-то типа fcgi я пока не в курсе как эта сторона на питоне устроена вообще.
Писать буду по мере сил под этот тег. Репа будет на гитхабе, все как у нормальных людей.