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

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

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

Требования

Для работы вам понадобится свежий сервер (мы используем Ubuntu 20.04, настроенный согласно этому руководству) и пользователь с привилегиями sudo.

Чтобы начать работу, войдите в систему как пользователь sudo.

1: Установка программного обеспечения

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

Используем Python 3, который поставляется с Ubuntu 20.04. Запустите установку:

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

Закончив установку, вы можете перейти к настройке базы данных.

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

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

Во время установки Postgres в ОС был создан пользователь postgres, который соответствует пользователю postgres (администратору PostgreSQL). Этого пользователя необходимо использовать для выполнения административных задач. Вы можете использовать sudo и передать имя пользователя через флаг -u.

Войдите в интерактивную строку Postgres, набрав:

sudo -u postgres psql

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

CREATE DATABASE myproject;

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

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

CREATE USER myprojectuser WITH PASSWORD 'password';

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

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';

Шифрование по умолчанию нужно установить на UTF-8, именно этот тип использует Django. Схемой изоляции транзакций по умолчанию нужно выбрать read committed, она блокирует чтение транзакций, по которым не было коммитов. Также сейчас нужно установить часовой пояс. По умолчанию проекты Django используют UTC (так рекомендует сам проект Django).

Осталось только предоставить пользователю БД права доступа к базе данных, которую вы создали:

GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

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

\q

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

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

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

sudo pip3 install virtualenv

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

mkdir ~/myproject
cd ~/myproject

Вы можете создать виртуальную среду для хранения зависимостей Python вашего проекта Django при помощи команды:

python3 -m virtualenv myprojectenv

Эта команда установит локальную копию Python и pip в каталог myprojectenv в каталоге вашего проекта.

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

source myprojectenv/bin/activate

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

(myprojectenv)user@host:~/myproject$

Как только вы запустите виртуальную среду, вы можете установить официальную версию Django с помощью pip. Установите также пакет psycopg2, который позволит нам использовать нашу базу данных Postgres:

pip install Django psycopg2

Примечание: Независимо от того, какую версию Python вы используете, в виртуальной среде следует использовать команду pip (не pip3).

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

django-admin startproject myproject .

Поддержка БД Django

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

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

nano ~/myproject/myproject/settings.py

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

. . .

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

. . .

В настоящее время проект использует БД SQLite. Нужно изменить это, чтобы он использовал PostgreSQL.

Во-первых, измените движок, чтобы он использовал адаптер postgresql вместо sqlite3. В качестве NAME укажите имя вашей базы данных (в данном примере она называется myproject). Также вам необходимо добавить учетные данные. Укажите имя пользователя, пароль и хост для подключения. Параметр port оставьте пустым, чтобы использовать значение по умолчанию:

. . .

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

. . .

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

В приведенном ниже фрагменте есть несколько закомментированных примеров просто для демонстрации:

. . .
# 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']

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

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

Перенос данных и тестирование

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

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

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

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

python manage.py createsuperuser

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

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

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

sudo ufw allow 8000

Открыв порт, вы можете проверить правильность работы вашей базы данных. Запустите сервер разработки Django:

python manage.py runserver 0.0.0.0:8000

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

http://server_domain_or_IP:8000

Вы должны увидеть стандартную приветственную страницу проекта.

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

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

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

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

Заключение

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

Tags: , , , , ,

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