Как использовать PostgreSQL в связке с приложением на Django на Ubuntu 16.04

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

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

Подготовка

Для начала необходим  сервер Ubuntu 16.04, настроенный пользователем non-root. Non-root пользователь должен быть настроен с привилегиями sudo. Узнай как это сделать при помощи руководство по настройке сервера.

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

Установка компонентов с репозиториев Ubuntu

Первым нашим шагом будет установка всех необходимых утилит из репозиториев. Нужно установить pip, менеджер пакетов Python, чтобы устанавливать и управлять нашими компонентами языка Python. Необходимо также установить программное обеспечение базы данных и связанные с ним библиотеки, которые нужны для взаимодействия.

Python 2 и Python3 требуют разные пакеты, поэтому ниже выбирайте те команды, которые соответствуют вашей версии Python, используемой в проекте.

Если вы используете 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

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

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

По умолчанию Postgres использует схему аутентификации“peer authentication” для локальных соединений. По существу это означает, что если имя пользователя операционной системы совпадает с именем пользователя Postgres, то пользователь может войти в систему без дальнейшей аутентификации. Во время установки Postgres был создан пользователь операционной системы Postgres, чтобы соответствовать административному пользователю Postgres программы  PostgreSQL.  Нам необходим этот пользователь для выполнения административных задач. Для этих целей можно использовать sudo и передать имя пользователя при помощи опции -u.

Войти в интерактивную оболочку Postgres можно выполнив следующую команду:

$ sudo -u postgres psql

Во первых, мы создадим базу данных для нашего проекта на Django. Из соображений безопасности каждый проект должен иметь собственную изолированную базу данных. В данном руководстве база данных будет именоваться как  myproject, но в будущем лучше использовать что-то более информативное:

postgres=# CREATE DATABASE myproject;

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

postgres=# CREATE USER myprojectuser WITH PASSWORD ‘password‘;

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

Кодировку по умолчанию ставим UTF-8, ее то Django и ждет. Также по умолчанию мы настраиваем уровень изолированности транзакций на уровень “чтения фиксированных данных”, который блокирует чтение из незавершенных транзакций. И наконец,  проект будет настроен на использование UTC. Эти настройки приведены ниже:

postgres=# ALTER ROLE myprojectuser SET client_encoding TO ‘utf8’;
postgres=# ALTER ROLE myprojectuser SET default_transaction_isolation TO ‘read committed’;
postgres=# ALTER ROLE myprojectuser SET timezone TO ‘UTC’;

Теперь, все что нам нужно – это предоставить свои права доступа пользователям базы данных, которую мы только-что создали:

$ postgres=# GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

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

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 myprojectenv/bin/activate

После активации приглашение изменится, чтобы ты видел, что активировал виртуальную среду. Это будет выглядеть примерно так (myprojectenv)[email protected]:~/myproject$.

После того, как мы активировали виртуальную среду, можно приступать к установке Django. Также мы будем устанавливать пакет psycopg2, который позволит использовать базу данных, которую мы настроили:

(myprojectenv) $ pip install django psycopg2

Теперь мы можем начинать проект Django внутри каталога myproject. Будет создана дочерняя директория с таким же именем, в которой будет лежать сам код и сценарий управления :

(myprojectenv) $ django-admin.py startproject myproject .

Настройка параметров базы данных Django

Теперь,  когда у нас есть проект, нужно его настроить, чтобы использовать базу данных. Откройте главный файл настроек , расположенный в дочерней директории проекта:

(myprojectenv) $ nano ~/myproject/myproject/settings.py

В нижней части файла настроек вы увидите раздел DATABASES, который выглядит следующим  образом:

 

~/myproject/myproject/settings.py

. . .
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,  он идет по умолчанию:

~/myproject/myproject/settings.py

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

Когда закончите, закройте и сохраните файл.

Миграция базы данных и тестирование проекта

Теперь, когда проект настроен, мы можем перенести созданные нами структуры данных в нашу базу данных и протестировать сервер. Мы можем начать с  создания и применения миграции в базе данных проекта. Так как у нас пока нет фактических данных, все же необходимо создать первоначальную структуру базы данных:

(myprojectenv) $ cd ~/myproject
(myprojectenv) $ python manage.py makemigrations
(myprojectenv) $

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


(myprojectenv) $ python manage.py createsuperuser

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

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

Разрешить внешние подключения к порту:

(myprojectenv) $ sudo ufw allow 8000

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

(myprojectenv) $ python manage.py runserver 0.0.0.0:8000

В адресной строке вашего браузера наберите:

http://server_domain_or_IP:8000

Вы должны увидеть страницу:

t5

Добавив /admin к концу URL вы получите страницу входа в систему через интерфейс администратора:

t6

Введите имя пользователя и пароль, который вы только что создали с помощью команды createsuperuser. Вам будет доставлен в интерфейс администратора:

п

Когда вы закончите исследование вы можете остановить сервер разработки, нажав CTRL-C в окне терминала.

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

Заключение

В данном руководстве было показано, как установить и настроить PostgreSQL в качестве серверной базы данных для проекта Django. Хоть SQLite и легко справляется с маленькой нагрузкой в процессе разработки, все же в большинстве проектов выгоднее использовать более полнофункциональные СУБД.