Рабочее место под веб-программирование на Python с Pyramid и PostgreSQL и PyCharm. Windows

Таки взялся делать проекты на программном каркасе (фреймворке) Pyramid из PylonsProject, посему опишу как быстро подготовить рабочее место (никакого Денвера или WAMP или XAMPP - не нужно, полностью моделировать хостинг не буду, инсталляция куда как проще и стабильнее работает и удобнее для отладки программ, нежели с Apache):

Сначала сам интерпретатор Python

а) На сегодня не все используемые библиотеки поддерживают Python 3, посему берем последнюю версию Python 2.

б) На хостинге моей - 64-битная FreeBSD, а на рабочем месте 64-х битная Windows, посему ставлю и Python 64-х битный.

Что, правда, не позволит использовать JIT-компиляцию с Psyco, ну да ладно. Если заставит нагрузка (посещаемость сайтов), то можно на Jython перейти, всяко быстрее чем Psyco.
Хотя, кажется мне, что лучше оптимизировать сам код на Python, а то ежели глупо писать, то никакие оптимизаторы и не помогут.
Да и выигрыш по производительности на сервере баз данных 64-битном и самом Python 64-битном должен быть хорошим.

в) Качается с http://python.org.
Бесплатный.
На дату написания этого текста - это Python 2.7.1, 64-битный

г) В пути (переменная среды окружения PATH) добавляю каталог, в который был установлен Python и подкаталог "Scripts" каталога куда установлен Python - в этот каталог автоматически помещаются всякие разные утилиты, устанавливаемые внутрь Python.
В моем случае эти каталоги "C:\Python27" и "C:\Python27\Scripts"

JetBrains PyCharm - интегрированная среда разработки программ на Python

Близкий родственник от известной уже много лет JetBrains Intellj IDEA и отлично себя зарекомендовавшей.

Есть интеграция с Django и Google AppServer, но эта часть - не пригодится, к сожалению.

Берется: http://www.jetbrains.com/
На момент написания этого текста последняя версия - PyCharm 1.1.1.
Единственная среди устанавливаемых не бесплатная программа. Столь хороша, что не жалко заплатить.

Есть 30-дневный пробные период.

Кстати, основные (если не все) разработчики - российские, фактически "сделано в Питере".

Ставить до Python программу JetBrains PyCharm ее нельзя - она сама определяет, где находится Python и себя настраивает. В версии 1.0 мне не удалось простым образом скорректировать где находится Python после установки JetBrains PyCharm. Возможно в 1.1.1 такой проблемы уже нет, но не буду провацировать проблему - ставлю JetBrains PyCharm после Python.

Сервер баз данных PostgreSQL

Не, не MySQL
Любопытная статья про наблюдаемый ныне закат MySQL:
http://citforum.ru/gazeta/170/
Решение о PostgreSQL я принял не в связи с этой статьей.

Качается с http://postgresql.org.
Бесплатный.
На дату написания этого текста - это PostgreSQL 9.0.2-1, 64-битный

Из того, что указал ручками:
а) Каталог для данных не в "C:\Program Files\PostgreSQL\9.0\data" как по умолчанию предлагалось, а "C:\PgData\9.0", чтобы проще было добираться до файлов, решая программистско-админовские задачи. Да и не дело это в "Program Files" данные хранить, чего то отстает установочная программа PostgreSQL от стандартов.

б) Пароль пользователя postgres простой очень, ибо это все же тестовая система система для разработки, а не рабочая.

в) Локаль (locale) выбрал Russian, Russa, ибо сайты с многоязычным интерфейсом не предполагаются, пусть по умолчанию базы данных создаются с настройкой на русский язык. Все равно буду кодировку UTF-8 в базах данных использовать - вряд ли это критично и для других языков, если понадобится.

Менеджер пакетов "setuptools" для Python

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

Проверяю, а не включили ли его в дистрибутив Python:
Запускаю python.exe, пишу "import setuptools", получаю исключение "ImportError". Значит, нет его еще в обычном дистрибутиве Python.

Нахожу "setuptools" в репозитарии http://pypi.python.org, а именно: http://pypi.python.org/pypi/setuptools

Там есть специальный вариант для Windows. Его и качаю. Его и ставлю. Естественно именно версию под Python 2.7.

На момент написания данного текста - это setuptools 0.6c11.

При установке происходит заморочка - установщик сообщает "Python version 2.7 required, which was not found in the registry". Эта проблема есть только на 64-битных Windows, как у меня.

Это есть проблема всех установщиков, созданных на базе т.н. "distutils 2.7" (видимо, у distutils 2.7.1 багу пофиксили, потому как psycopg2 версии 2.3.1, чья программа установки создана с distutils 2.7.1 поставился нормально - см. ниже про установку "psycopg2").

Если верить интернету, то решается одним из нескольких вариантов на выбор:

а) Копированием ветки Windows Registry "HKEY_LOCAL_MACHINE\SOFTWARE\Python" в ветку "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Python" с использованием утилиты Windows "regedit.exe" (через операции "Экспорт ветки" и "Импорт ветки")

б) Использованием установщика ez_setup.py: "http://peak.telecommunity.com/dist/ez_setup.py", которые запускается с помощью Python с использовании командной строки "python.exe ez_setup.py". Нужные файлы будут автоматически скачаны из интернета. У меня этим способом не получилось ни под Windows 7 64-битную ни под FreeBSD 8.1 64-битную.

Поправка: спустя пару месяцев под Windows 7 64-битной - этим методом получилось.

в) Скачиванием исходников (благо для Python они обычно не отличаются от скомпилированных файлов в том смысле, что компилируются автоматически и почти все распространяется с исходниками) которые можно скачать там же на http://pypi.python.org/pypi/setuptools в файле "setuptools-0.6c11.tar.gz".
Исходники нужно распаковать и запустить программу установки "python.exe setup.py install"

Драйвер psycopg2 (адаптер, интерфейс) для подключения из Python к серверу PostgreSQL

Дом драйвера:
http://initd.org/psycopg/

Есть готовый под Windows:
http://www.stickpeople.com/projects/python/win-psycopg/#Version2
Поскольку драйвер будет в включать бинарники под конкретную операционку, то не хочу заморачиваться на Windows с их компиляцией (под FreeBSD с этим проще), а выберу готовый дистрибутив под Windows.

На дату написания этого текста:
psycopg2-2.3.1, под 64-битную Windows для Python 2.7 и PostgreSQL 9.0.1 - почти мой случай (только у меня PostgreSQL 9.0.2).
Бесплатный.

Замечу, программа установки драйвера также создана с distutils (но версии 2.7.1), но она нашла установленный в Windows 64-битную Python 2.7 64-битный без проблем в отличие от программы установки "setuptools" (сделанной с использованием distutils 2.7).

Виртуальное окружение с помощью "virtualenv" - рекомендации к Python до установки Pyramid

"virtualenv" позволяет не загаживать Python толпою пакетов и точно знать какие именно пакеты в том или ином случае используются.

Ставлю virtualenv. Поскольку уже есть "setuptools", то все просто:
easy_install virtualenv
Сам качает, сам ставит. Версия на момент написания этого текста virtualenv 1.5.1

Установка Pyramid в "вируальном окружении"

Делаю "виртуальное окружение" для Pyramid
virtualenv pyramid_env
(в документации к Pyramid рекомендуют по другому "virtualenv --no-site-packages env" - но у меня под Windows 7 64-битной такая команда вызвала кучу ошибок. Позже устанавливал под FreeBSD 8.1 64-битную - там сработала именно такая команда, которая с Windows не получилась)

Захожу в каталог "витруального окружения":
cd "C:\Python27\pyramid_env\Scripts"

И устанавливаю в этом "виртуальном окружении" Pyramid:
easy_install.exe pyramid

Обращаю внимание, что некоторые устанавливаемые компоненты хотят быть ускоренными и имеют для этого написанные на C модуля, но их компиляция не делается, потому получаю предупреждение, то ускорения не будет.

В каталоге "C:\Python27\pyramid_env\Lib\site-packages\" вижу, что Pyramid для работы нужно очень много чего:

chameleon-1.2.13-py2.7.egg
easy-install.pth
mako-0.3.6-py2.7.egg
markupsafe-0.11-py2.7.egg
paste-1.7.5.1-py2.7.egg
pastedeploy-1.3.4-py2.7.egg
pastescript-1.7.3-py2.7.egg
pip-0.8.1-py2.7.egg
pyramid-1.0b1-py2.7.egg
repoze.lru-0.3-py2.7.egg
setuptools-0.6c12dev_r88124-py2.7.egg
setuptools.pth
translationstring-0.3-py2.7.egg
venusian-0.6-py2.7.egg
webob-1.0.1-py2.7.egg
zope.component-3.10.0-py2.7.egg
zope.configuration-3.7.2-py2.7.egg
zope.deprecation-3.4.0-py2.7.egg
zope.event-3.5.0_1-py2.7.egg
zope.i18nmessageid-3.5.3-py2.7-win-amd64.egg
zope.interface-3.6.1-py2.7-win-amd64.egg
zope.schema-3.7.1-py2.7.egg

Не зря поставил Pyramid в виртуальное окружение, а то бы вся эта куча пакетов была бы в основном каталоге пакетов.

Проверка правильности работы Pyramid без базы данных

Создаю новый каталог, перехожу в него, устанавливаю в этот каталог шаблон "pyramid_starter" из поставки Pyramid. Для этого запускаю утилиту "paster" из "виртуального окружения":

"C:\Python27\pyramid_env\Scripts\paster.exe create test -t pyramid_starter"

Появляется каталог - "test" , содержащие готовый дистрибутив приложения, созданное с помощью Pyramid. Само приложение находится в подкаталоге "test\test"

Захожу в каталог "test". Готовлю приложение к "развертыванию":
"C:\Python27\pyramid_env\Scripts\python.exe setup.py develop"
При этом скачиваются и устанавливаются недостающие пакеты Python.

Затем запускаю веб-сервер:
"C:\Python27\pyramid_env\Scripts\paster.exe serve development.ini"
Вижу, что веб-сервер стартовал и ждет меня на порту 6543

В браузере набираю http://127.0.0.1:6543 и вижу то, что и должно быть - страничку с уведомление,м что "Welcome to test, an application generated by the Pyramid web application development framework" и ссылками на документацию по Pyramid.

Проверка правильности работы Pyramid с базой данных SQLite

Захожу в пустой каталог.
Создаю приложение, готовое к развертыванию (дистрибутив) командой:
"C:\Python27\pyramid_env\Scripts\paster.exe create test2 -t pyramid_alchemy"

Появляется каталог - "test2"
Перехожу в каталог "test2".

По умолчанию приложение созданное из шаблона "pyramid_alchemy" сконфигурировано для работы с базой данных "sqlite3" - это такая база данных, состоящая из одной DLL, хранящая данные в одном файле и поддерживающая работу с SQL-запросами.

Готовлю приложение к работе:
"C:\Python27\pyramid_env\Scripts\python.exe setup.py develop"
Заметно, что при этом много пакетов скачивается, в частности, SQLAlchemy.

"C:\Python27\pyramid_env\Scripts\paster.exe serve development.ini"
Дожидаюсь сообщения, что веб-сервер стартовал, смотрю на каком порту (на том же что и первое веб-приложение "test", то, что без базы данных), запускаю браузер, захожу, смотрю.

Различие в том, что на странице есть ссылка "test" под полем ввода для поиска, жму ее - получаю ответ, сгенерированный на основе данных, хранимых в базе данных.

Все в сборе: Pyramid, SQLAlchemy, PostgreSQL

Приложение "test2", созданное из шаблона "pyramid_alchemy", изначально сконфигурировано для работы с базой данных "SQLite" - меняю в конфигурации базу данных на PostgreSQL.

Сначала с помощью входящей в состав PostgreSQL утилиты pgAdmin III создаю базу данных "testdb", создаю пользователя "user" с паролем "password" и правом модернизировать структуру базы данных (с правом создавать объекты в базе данных).

Прописываю базу данных "testdb" в файле "development.ini", исправив строчку, где указана база данных типа sqlite на такую:
"sqlalchemy.url = postgresql+psycopg2://user:password@127.0.0.1:5432/testdb"

Очевидно, что здесь написано, что база данных называется "testdb", обслуживается сервером PostgreSQL и SQLAlchemy будет получать доступ к базе данных через адаптер (драйвер) "psycopg2".

Запускаю веб-сервер:
"C:\Python27\pyramid_env\Scripts\paster.exe serve development.ini"

Проверяю через браузер.

Все путем.
Pyramid мне нравится все больше и больше...

Ошибка в mimetypes...

Все работало много дней, но вдруг:

Начала выпадать замечательная ошибка при запуске веб-приложения, написанного на Pyramid:

File "C:\Python27\lib\mimetypes.py", line 355, in init
db.read_windows_registry()
File "C:\Python27\lib\mimetypes.py", line 259, in read_windows_registry
for ctype in enum_types(mimedb):
File "C:\Python27\lib\mimetypes.py", line 249, in enum_types
ctype = ctype.encode(default_encoding) # omit in 3.x!
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128)

Что только не думал, даже переставил Python.

Оказалось все просто: под Windows в определении типов MIME вдруг ни с того ни с сего (скорее всего, какая то свежеустановленная программа создала) появлись кириллица.

Запускаю regedit и правлю ветку [HKEY_CLASSES_ROOT\CLSID\{4063BE15-3B08-470D-A0D5-B37161CFFD69}\EnableFullPage\MIME] на 32-битной или ветку [HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{4063BE15-3B08-470D-A0D5-B37161CFFD69}\EnableFullPage\MIME] на 64-битной Windows.

Нужно переделать из кириллицы в латиницу названия подветок. Или удалить, я так и сделал, потому что после переименования regedit сказал мне, что такие имена разделов уже существуют.

И аналогично в ветке [HKEY_CLASSES_ROOT\MIME\Database\Content Type]

И все будет хорошо.

Компьютерные вопросы: 
2002-2012 ©