clubchicagokyxnya19a

Django под Windows — рецепт солянки

Настройка Linux среды Python/Django разработки под Windows с помощью VirtualBox и PyCharm на примере Debian

Ингридиенты

  1. Ноутбук с предустановленной Windows 8.1: 1,5 кг
  2. VirtualBox: 1 литр
  3. Debian: 0.5 тушки (можно заменить на целую тушку Ubuntu или другой Linux, который есть в вашем магазине, но с Debian наваристее)
  4. VirtualBox Guest Addition: 1 горсть
  5. PyCharm: 1 луковица
  6. deb-пакеты: 5-10 пакетов
  7. Python модули: все, что у вас есть в холодильнике
  8. Эстетическое неприятие дуалбут и необходимость работы с Photoshop: по вкусу

Время приготовления: 2 суток.

Установить VirtualBox

  1. Скачать и установить основной дистрибутив VirtualBox.
  2. Скачать и установить пакет дополнений гостевой ОС (см. вставку в соответствующем пункте).

Установить Debian 7

Проще всего использовать netinst образ соответствующий архитектуре вашей системы. Варить около получаса. Не пересаливать предустановленными пакетами.

Установить гостевые дополнения в VirtualBox

Внимание! При использовании версии дополнений 4.3.10 возникает ошибка во время монтирования общих папок! https://www.virtualbox.org/ticket/12879 Скачать образ дополнений 4.3.11 https://www.virtualbox.org/download/testcase/VBoxGuestAdditions_4.3.11-93070.iso

  1. Подключить скачанный образ. Устройства — Приводы оптических дисков — Выбрать образ оптического диска.
  2. Смонтировать cdrom

    # mount /dev/sr0 /media/cdrom
    
  3. Установить make, gcc, bzip2

    # apt-get install make gcc bzip2
    
  4. Запустить run скрипт с диска

    # cd /media/cdrom
    # ./VBoxLinuxAdditions.run
    

Настроить общие папки

Общие папки очень удобны для разработки, позволяя избежать загрузки файлов по FTP в гостевую ОС и исполнять код прямо из папки проекта хостящей ОС.

  1. Добавить новую общую папку. НастройкиОбщие папкиДобавить. Указать путь (например E:\Dev\django) к папке и ее имя (например, django). Поставить галку возле Создать постоянную папку.
  2. Примонтировать устройство в гостевой ОС

    # mount -t vboxsf django /home/myuser/django -o rw,dmode=775,uid=1000,gid=1000
    
  3. Если папка появилась в нужной точке в необходимом виде, то можно добавить правило в /etc/fstab для автоматического монтирования при старте системы.

    django /home/myuser/django vboxsf rw,dmode=775,uid=1000,gid=1000 0 0
    

    ВНИМАНИЕ! Не допускай опечатку в слове vboxsf!

Установить все необходимые для разработки пакеты

  1. Python

    # apt-get install python-dev
    
  2. MySQL

    # apt-get install mysql-server mysql-client python-mysqldb libmysqlclient-dev
    
  3. PIL

    # apt-get install python-imaging
    
  4. Модули Python

    # apt-get install python-pip
    # pip install -U pip
    # pip install virtualenv
    

Настроить SSH доступ к гостевой ОС

  1. Установить OpenSSH сервер.

    # apt-get install openssh-server
    
  2. Пробросить произвольный порт хостящей ОС на 22 порт гостевой ОС. УстройстваСетьНастроить сеть. По умолчанию тут уже настроен тип подключения NAT. Зайти в раздел Проброс портов и настроить запись вида: имя — ssh, порт хоста — например, 3022, порт гостя — 22. Настроить подключение в Putty к 127.0.0.1:3022.

Установить и настроить MySQL Workbench

  1. Скачать
  2. Настроить соединение по SSH через проброшенный порт и гостевого пользователя
  3. Использовать по назначению

Настроить проект в PyCharm

  1. Настроить удаленный интерпретатор
  2. Установить python-зависимости
  3. Добавить необходимую запись в C:\Windows\System32\drivers\etc\hosts хоста
  4. Добавить необходимую запись в /etc/hosts гостевой ОС
  5. Пробросить порт с хоста (например, 8800) на 8000 порт гостевой ОС
  6. Настроить конфигурацию запуска dev-сервера в PyCharm. Задать отображение (меппинг) локальной рабочей директории на удаленную, чтобы удаленный интерпретатор обнаружил manage.py скрипт. В качестве хоста указать 0.0.0.0 для того, чтобы dev-сервер отвечал на любом сетевом интерфейсе. Порт оставить 8000.

Установить дополнительно

  1. 4t Tray Minimizer — позволяет сворачивать произвольную программу в системный трей, чтобы убрать раздражающее «залипание» на VirtualBox при Alt+Tab переключении.
  2. Установить PostgreSQL и инструменты для работы с ней аналогично MySQL.

Побочные эффекты

  1. В данный момент в PyCharm (2.7) недоступны пункты меню Run Django conaole и Run manage.py task при использовании удаленного интерпретатора — тикет в трекере.
5470388254_fdcb64ea9d_z

Удаление базы данных IndexedDB в Chrome

Разбираюсь сейчас с разработкой приложений под Google Chrome (chrome apps). Chrome предлагает сразу несколько вариантов хранения данных — Web SQL, IndexedDB, Local Storage, Session Storage, ну и Cookies, конечно. Решил, что для моих целей лучше всего подходит IndexedDB. Естественно, в процессе изучения, разработки и отладки мне приходится много раз создавать, редактировать и удалять записи вручную. Для этого в Chrome Dev Tools встроены инструменты для управления локальными хранилищами — закладка Resources -, но вот почему-то удалить базу данных IndexedDB через GUI панели разработчика нельзя (Chrome 33).

Зато можно удалить базу программно набрав в консоле:


indexedDB.deleteDatabase('myBaseName');

10-©-Kent-Sheely1

Проблемы при деплое Django на виртуальный хостинг на примере sweb.ru

Продолжаю собирать шишки во время деплоя Django на виртуальный хостинг. Пока имею дело с хостерами рунета. Скучать не приходится. Каждый новый хостер — новая проблема.
Итак, Spaceweb открывает соединение с базой MySQL в национальной кодировке cp1251, а не толерантной utf-8. Это приводит к выбросу исключения вида «codec can’t decode byte…» где-то в недрах модуля MySQLdb.

Я расцениваю это исключительно как оголтелое проявление национализма и разжигание розни на национальной почве.

Лечится так


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'xxx',
        'USER': 'xxx',
        'PASSWORD': 'xxx',
        'HOST': '',
        'PORT': '',
        'OPTIONS': {
            'init_command': 'set names utf8',
        },
    }
}

1379004816_51500000

403 Forbidden Error

Который раз уже теряю время на этом моменте во время настройки Apache+PHP окружения разработки на Ubuntu машине.

Я не люблю плодить лишних сущностей и держу папки с проектами, которые разрабатываю, в домашней директории.
Чтобы дать возможность Apache исполнять PHP-скрипты из домашней директории нужно сделать следующее.

1. Включить себя в группу www-data:
sudo usermod -a -G www-data myusername

2. Проверить, что предыдущая команда возымела действие:
id

3. Назначить группу-владельца папки проекта www-data:
chown myusername:www-data -R /path/to/project/dir

4. Назначить права на доступ к папкам проекта себе и группе:
chmod 755 -R /path/to/project/dir

5. И вот этот пункт самая мякотка. Назначить права исполнения (1, x) для всех пользователей (третья группа прав) всем директориям выше папки проекта. Право исполнения для директории означает доступ к содержимому по указанию прямого пути при наличии соответствующих прав на это содержимое даже при отсутствии права на листинг (r) директории. Иначе Апач (www-data:www-data) просто не видит ваш проект в недрах папок, к которым у него нет доступа.

DSC_0179

Проблемы при деплое Django на виртуальный хостинг на примере jino.ru

Деплой Django на виртуальный хостинг для меня частенько превращается в квест. Это происходит из-за большого количества зависимостей Django от программного системного окружения. Но беда даже не в их количестве, а в том, что существует несколько способов их разрешения. Это красота и боль UNIX-way, воплощенная в python.

Одним из инструментов, призванных облегчить работу в этом хаосе, является виртуальное Python-окружение virtualenv. Да, использование virtualenv безусловно полезная практика, но virtualenv не решает всех проблем. Некоторые python-модули написаны на C и требуют компиляции при установке, а также имеют зависимости от -dev версий системных библиотек. Такие зависимости невозможно разрешить самостоятельно, имея лишь права пользователя виртуального хостинга. Админы же хостинга не всегда считают нужным об этом позаботиться, а времени на переписку с саппортом частенько нет. Один из таких хостингов jino.ru.

Яркий пример таких «проблемных» пакетов жизненно необходимые в большинстве Django проектов mysql-python (MySQLdb) и PIL. Проблему можно попробовать решить, используя ключ —system-site-packages при создании виртуального окружения. И тогда, если тебе немного повезет, в системе уже будут установлены эти пакеты не очень древних версий. Обрати внимание, что поведение по умолчанию в отношении установки системных пакетов у virtualenv менялось с течением времени. Поэтому либо качай и используй свежую версию virtualenv, либо предварительно сверься с документацией к используемой версии.

В моем случае ситуацию дополнительно усложняло то, что я использую более свежий форк PIL-а Pillow, так как PIL уже много лет как заброшен своими мейнтейнерами и не умеет работать с новыми форматами изображений. А Pillow для обратной совместимости маскируется под PIL и импортируется в скрипты под его псевдонимом, что избавляет от правки исходников своих и сторонних пакетов. Таким образом, при наличии PIL в окружении (один из системных пакетов), становится невозможной работа с Pillow.

В случае с Джино, я попал в следующую ситуацию: с одной стороны мне нужны системные пакеты в virtualenv из-за MySQLdb, а с другой нет — из-за PIL. Возможности выборочной установки или деинсталяции системных пакетов в virtualenv на данный момент нет. Проблему решил хладнокровным удалением PIL из myenv/lib/pythonx.x/site-packages.

Top-20 самых активных питонистов

Наткнулся сегодня на рейтинг самых активных пользователей GitHub за 2013 год. Думаю, это люди, у которых есть чему поучиться.

Это список top-20 питонистов из рейтинга со ссылками на профиль GitHub и личные сайты.

#19 fsouza (Francisco Souza) Rio de Janeiro, Brazil http://f.souza.cc
#36 alex (Alex Gaynor) San Francisco http://alexgaynor.net
#41 andrewsmedina (Andrews Medina) Rio de Janeiro http://www.andrewsmedina.com
#45 dcramer (David Cramer) San Francisco, CA http://justcramer.com
#80 pydanny (Daniel Greenfeld) Inland Empire, CA http://pydanny.com
#89 ask (Ask Solem Hoel) London, UK https://twitter.com/asksol
#114 stephenmcd (Stephen McDonald) Sydney Australia http://blog.jupo.org
#129 benoitc (Benoit Chesneau) Creil, France http://benoitc.im
#131 kennethreitz (Kenneth Reitz) Winchester, VA http://kennethreitz.org
#137 jtauber (James Tauber) Burlington, MA http://jtauber.com
#143 ericholscher (Eric Holscher) Portland, Or http://ericholscher.com
#165 audreyr (Audrey Roy) Inland Empire, CA http://www.audreymroy.com
#180 jezdez (Jannis Leidel) Berlin, Germany https://twitter.com/jezdez
#181 bitprophet (Jeff Forcier) Lafayette, CA http://bitprophet.org
#189 klen (Kirill Klenov) Russia, Moscow http://klen.github.io
#191 yuvipanda (Yuvi Panda) Chennai http://yuvi.in
#202 mitsuhiko (Armin Ronacher) United Kingdom / Austria http://lucumr.pocoo.org
#221 bryanveloso (Bryan Veloso) Los Angeles, CA http://avalonstar.com
#223 toastdriven (Daniel Lindsley) Lynnwood, WA http://www.toastdriven.com
#225 jakevdp (Jake Vanderplas) Seattle WA http://jakevdp.github.io

Почти все персонажи уже были знакомы, но несколько новых лент я добавил в Feedly.

Рестарт supervisorctl во время деплоя

Проект, над которым сейчас работаю, развернут на базе Gunicorn + NGINX + Supervisor. Этот вариант деплоя требует перезапуска проекта с правами суперпользователя после обновления исходников.


supervisorctl restart myproject

Это несколько неудобно, так как обновление проекта производится под выделенной учетной записью myproject, а потом приходится логиниться в root. Проблема решается добавлением пользователя myproject в /etc/sudoers, но аккуратно, руководствуясь принципом предоставления необходимого минимума привилегий.


myproject ALL = (root) NOPASSWD:/usr/bin/supervisorctl restart myproject

Настройка Django для отправки почты с mail.ru

Рабочие для меня настройки в settings.py получились такими:


EMAIL_HOST = 'smtp.mail.ru'
EMAIL_PORT = 2525
EMAIL_HOST_USER = 'site@mysite.ru'
EMAIL_HOST_PASSWORD = 'xxx'
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = 'site@mysite.ru'
SERVER_EMAIL = 'site@mysite.ru'

Внимание! Отправка почты на порт, указанный в их официальном хелпе (465, http://help.mail.ru/mail-help/mailer/popsmtp), глухо падала по таймауту.

Также немногим ранее выяснилось, что хостер locum.ru не позволяет коннектиться к внешним SMTP на 25 порту, так как данный порт прокинут на их собственный SMTP сервер.

Плагины VIM, которые я использую

За последние два года я предпринимал несколько безуспешных попыток перехода на использование VIM в качестве основного редактора кода. На этот же период пришлось использование PyCharm и PHPStorm, как логичного результата поиска оптимальной среды разработки при неспособности освоить VIM. Обе IDE служили мне верой и правдой все это время, но настало время решающей битвы за Идеальное Рабочее Окружение.

Gundo.vim
NERDTree
MiniBufExpl
NERDCommenter
PEP-8
Powerline
Pyflakes
Tagbar
Solarized

Пока так. Список буду периодически актуализировать.

UPD: Все-таки PyCharm рулит )

Доступ к Django дев-серверу из локальной сети

Понадобилось мне произвести отладку сайта на реальном Android устройстве. Самый простой способ — попытаться открыть сайт по Wi-Fi сети, которую раздает роутер и к которой подключен мой ноутбук. С наскоку доступа к сайту по адресу вида 192.168.1.3:8000 получить не удалось. Тут нужно уточнить, что я обычно поднимаю дев-сервер на домене вида mysite.dev, который прописываю в /etc/hosts строкой 127.0.0.1 mysite.dev. Это дает возможность запоминать в браузере пароли при переключении между разными проектами и некоторые другие мелкие плюшки. То есть, фактически, в моем случае manage.py runserver поднимает веб-сервер на 127.0.0.1:8000, который доступен только с самой машины.

Для доступа же из вне дев-сервер нужно запускать так:


python manage.py runserver 192.168.1.3:8000

Или для одновременного доступа откуда угодно:


python manage.py runserver 0.0.0.0:8000