Django-приложение на PostgreSQL в Debian 8

Django – это гибкий фреймворк для быстрой разработки приложений Python. По умолчанию Django использует для хранения данных легковесную СУБД SQLite, которая не всегда справляется с нагрузками масштабных приложений. Поэтому её рекомендуется заменить более прочной системой управления базами данных.

Данное руководство продемонстрирует установку PostgreSQL и настройку Django для использования этой СУБД, включая такие этапы:

  • Установку всего необходимого программного обеспечения;
  • Создание учётных данных БД;
  • Запуск и настройку Django-проекта для использования PostgreSQL на бэкэнде.

Требования

  • Свежий сервер Debian 8.
  • Пользователь с доступом к sudo.

Все необходимые инструкции можно найти в руководстве по начальной настройке.

Установка зависимостей

Для начала нужно установить из репозиториев системы недостающее программное обеспечение: менеджер пакетов pip, базу данных и связующие библиотеки.

Список зависимостей Python 2 и Python 3 немного отличается.

Чтобы установить зависимости Python 2, введите:

sudo apt-get update
sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib

Если вы используете Python 3, введите:

sudo apt-get update
sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib

Создание базы данных и пользователя PostgreSQL

Для локальных соединений PostgreSQL по умолчанию использует схему так называемой «одноранговой аутентификации» (англ. peer authentication). В целом это означает, что если имя пользователя операционной системы совпадает с именем валидного пользователя Postgres, данный системный пользователь может войти в СУБД без дальнейшей аутентификации.

При установке PostgreSQL был создан пользователь операционной системы по имени postgres, что совпадает с пользователем postgres – администратором системы PostgreSQL. Измените пользователя и войдите как postgres. Для этого можно использовать sudo и опцию –u:

sudo -u postgres psql

Итак,  сначала нужно создать БД для проекта Django. Каждый проект должен иметь индивидуальную базу данных. В этом руководстве БД условно называется myproject, но лучше использовать более описательное имя.

CREATE DATABASE myproject;
CREATE DATABASE

Примечание: Все команды SQL оканчиваются символом точки с запятой.

Теперь нужно создать пользователя БД для подключения и взаимодействия с ней. Выберите надёжный пароль:

CREATE USER myprojectuser WITH PASSWORD 'password';
CREATE ROLE

Затем нужно изменить параметры подключения для нового пользователя. Это позволит ускорить выполнение операций базы данных, при этом значения не придётся запрашивать при установке каждого соединения.

Установите UTF-8 как кодировку по умолчанию, чего требует Django. Также установите схему по умолчанию изоляции транзакций «read committed», которая блокирует считывание с незавершенных транзакций. В завершение нужно установить часовой пояс. По умолчанию проекты Django будут использовать UTC.

ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myprojectuser SET timezone TO 'UTC';
ALTER ROLE
ALTER ROLE
ALTER ROLE

Примечание: Больше рекомендаций по настройке PostgreSQL можно найти здесь.

Теперь нужно передать права на доступ к этой базе данных новому пользователю:

GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
GRANT

Закройте командную строку SQL и вернитесь в сессию оболочки пользователя postgres:

\q

Установка Django в виртуальную среду

Теперь БД полностью готова к работе, можно переходить к установке Django. Виртуальное окружение (или виртуальная среда) позволяет сделать установку Django и зависимостей более гибкой.

Чтобы установить пакет virtualenv, введите:

# Python 2:
sudo pip install virtualenv
# Python 3:
sudo pip3 install virtualenv

Создайте каталог для хранения проекта Django и откройте его:

mkdir ~/myproject
cd ~/myproject

Теперь нужно создать виртуальную среду для хранения зависимостей проекта Django:

virtualenv myprojectenv

Эта команда установит локальную копию Python и pip в каталог myprojectenv, который находится в каталоге проекта.

Прежде чем устанавливать приложение в виртуальную среду, нужно включить её:

source venv/bin/activate

Командная строка изменит внешний вид; это значит, что виртуальное окружение успешно включено:

(venv)user@host:~/myproject$

Теперь можно установить Django при помощи pip. Также нужно установить пакет psycopg2, позволяющий использовать предварительно настроенную БД:

pip install django psycopg2

Примечание: Вне зависимости от версии Python в виртуальной среде нужно использовать команду pip (не pip3).

Запустите проект Django в каталоге myproject. Это создаст одноимённый дочерний каталог для хранения кода и скрипт внутри этого каталога.

django-admin.py startproject myproject .

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

На данный момент структура каталогов должна выглядеть примерно так:

.
└── ./myproject/
├── manage.py
├── myproject/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── venv/
└── . . .

Настройка базы данных Django

Теперь, когда проект готов, нужно настроить созданную для него базу данных.

Откройте главный конфигурационный файл проекта Django:

nano ~/myproject/myproject/settings.py

Для начала нужно отредактировать директиву ALLOWED_HOSTS, которая определяет белый список адресов и доменов, имеющих доступ к Django. Все входящие запросы с заголовком Host, который не входит в этот список, будут сброшены. Это позволяет предотвратить определенные уязвимости в системе безопасности Django.

Перечислите в квадратных скобках все заведомо безопасные для Django IP-адреса или домены. Каждый элемент нужно взять в одинарные кавычки. Все элементы списка разделяются запятыми. Чтобы добавить в список поддомены, поставьте перед доменным именем точку. В приведённом ниже фрагменте вы найдёте несколько закомментированных примеров того, как может выглядеть директива ALLOWED_HOSTS.

. . .
# The simplest case: just add the domain name(s) and IP addresses of your Django server
# ALLOWED_HOSTS = [ 'example.com', '203.0.113.5'] # To respond to 'example.com' and any subdomains, start the domain with a dot
# ALLOWED_HOSTS = ['.example.com', '203.0.113.5'] ALLOWED_HOSTS = ['your_server_domain_or_IP', 'second_domain_or_IP', . . .]

В конце файла найдите раздел DATABASES:

. . .
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
. . .

На данный момент фреймворк настроен для использования базы данных SQLite. Это нужно изменить, указав вместо SQLite систему управления базами данных PostgreSQL.

Для начала измените значение engine, указав в качестве бэкэнда postgresql_psycopg2 вместо sqlite3. В строке NAME укажите имя базы данных (в данном случае – myproject). Также нужно указать учётные данные и добавить опцию port без значения (чтобы выбрать настройку по умолчанию).

. . .
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproject',
'USER': 'myprojectuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}
. . .

Сохраните и закройте файл.

Перемещение базы данных и тестирование проекта

Теперь фреймворк Django полностью настроен для взаимодействия с БД. Переместите данные в БД и протестируйте сервер.

Для начала создайте миграции для БД. Поскольку на этот момент данных ещё не существует, это просто мигрирует исходную структуру БД:

cd ~/myproject
./manage.py makemigrations
./manage.py migrate

Затем создайте учётную запись администратора:

./manage.py createsuperuser

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

Примечание: Если сервер настроен согласно этому руководству, на данный момент порт сервера разработки Django заблокирован брандмауэром UFW. Чтобы протестировать работу приложения, нужно разблокировать этот порт.

sudo ufw allow 8000

Если вы используете iptables, команда во многом будет зависеть от текущих настроек брандмауэра. В большинстве случаев сработает такое правило:

sudo iptables -I INPUT -p tcp --dport 8000 -j ACCEPT

Читайте также: Настройка фаервола с помощью IPTables в Ubuntu 14.04

Теперь можно протестировать приложение, запустив сервер разработки Django:

./manage.py runserver 0.0.0.0:8000

В браузере посетите домен или IP, указав порт :8000, чтобы открыть стандартную страницу Django:

http://server_domain_or_IP:8000

На экране появится стандартная приветственная страница:

It worked!
Congratulations on your first Django-powered page.

Добавьте к ссылке секцию /admin, чтобы получить доступ к странице входа в интерфейс администратора.

Заполните появившиеся на экране поля, указав имя и пароль только что созданной учётной записи администратора при помощи команды createsuperuser. После этого на экране появится интерфейс администратора.

Завершив проверку, остановите сервер разработки, нажав CTRL-C в окне терминала.

Получив доступ к интерфейсу, вы убедились, что БД хранит информацию проекта и взаимодействует с ним.

Также вы можете попробовать создать запрос к БД Postgres с помощью клиента psql. К примеру, можно подключиться к БД проекта (в данном случае она называется myproject) при помощи пользователя проекта (myprojectuser) и вывести все доступные таблицы:

psql -W myproject myprojectuser -h 127.0.0.1 -f <(echo '\dt')

Флаг –W запросит пароль. Флаг –h позволяет подключиться к локальному хосту по сети и использовать парольную аутентификацию вместо одноранговой. Флаг –f передаёт psql метакоманду \dt, которая выведет все таблицы БД.

List of relations
Schema |            Name            | Type  |     Owner
-------+----------------------------+-------+---------------
public | auth_group                 | table | myprojectuser
public | auth_group_permissions     | table | myprojectuser
public | auth_permission            | table | myprojectuser
public | auth_user                  | table | myprojectuser
public | auth_user_groups           | table | myprojectuser
public | auth_user_user_permissions | table | myprojectuser
public | django_admin_log           | table | myprojectuser
public | django_content_type        | table | myprojectuser
public | django_migrations          | table | myprojectuser
public | django_session             | table | myprojectuser
(10 rows)

Как видите, фреймворк Django создал несколько таблиц в БД, а это значит, что он может взаимодействовать с базой данных.

Заключение

Конечно, БД SQLite очень проста в использовании и без труда справляется с нагрузкой на этапе разработки. Но всё же в большинстве случаев её ресурсов на этапе производства оказывается недостаточно, потому рекомендуется использовать в качестве бэкэнда полнофункциональную базу данных, например, PostgreSQL.

Tags: , , , , ,

Добавить комментарий