Магія unicode у psycopg2

При написанні простенького веб-сервісу на Python/Django з доступом напряму до PostgreSQL, я зіткнувся з дивною поведінкою. Коли код запускався на тестовому сервері Django (manage.py runserver), psycopg2 вертав рядки як 'str' у кодуванні UTF-8. А коли запускався через WSGI під Apache2, то unicode. Я спочатку не вникав, чому так, але правити код на сервері після кожного оновлення, коли полізуть помилки, це не діло.

Маю підозру, що Django-вський сервер звертає увагу на # -*- coding: utf-8 -*-, тоді як mod_wsgi має це оголошення в носі, або навпаки.

Коли вже не знав що робити, як завжди допомогла документація. Там пишуть, що в Python 2 ви скоріш за все захочете завжди отримувати unicode. Так, я такий - хочу unicode. Для цього, одразу після імпорту psycopg2, задайте йому глобальні налаштування приведення типів, ось так:

import psycopg2

psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)

І не сушіть собі більше голову, у вас завжди буде unicode :)


"Системні" налаштування Django-проекту

Цікавий підхід до організації файлу налаштувань Django-проекту (settings.py).

Виносимо певні змінні конфігурації "за дужки", може бути корисним для використання спільних опцій для кількох проектів або спрощення процедури оновлення проекту (локальні налаштування за межами каталогу проекту).

### settings.py

import os

ENVIRONMENT_SETTING_FILE = '/etc/django.myproject.settings'

### this will load all environment file settings in here

execfile(ENVIRONMENT_SETTING_FILE)

### all common settings

### ...