[Перевод] Как использовать PostgreSQL с Django в Ubuntu 22.04

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

b8813f8e01f6b5eaa350073bba545795.jpg

Вам понадобится 

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

«PostgreSQL База»

Шаг 1: установка компонентов из репозиториев Ubuntu

Сначала обновим кэш менеджера пакетов с помощью apt:

sudo apt update

Затем установим необходимые компоненты: pip (менеджер пакетов Python), Postgres и связанные с ним библиотеки:

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

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

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

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

Во время установки Postgres был создан пользователь операционной системы с именем postgres, соответствующий пользователю-администратору postgres. Нужно использовать этот пользовательский postgres для выполнения административных задач. Применим sudo для передачи имени пользователя postgres вместе с параметром-u.

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

sudo -u postgres psql

Затем создадим базу данных для проекта Django. По соображениям безопасности каждый проект должен иметь собственную изолированную базу данных. В этой статье база данных называется myproject, но в работе рекомендуем давать ей более описательные названия. Также обращаем внимание на то, что важно не забывать заканчивать команды в командной строке SQL точкой с запятой — ;:

CREATE DATABASE myproject;

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

CREATE USER myproject_user WITH PASSWORD 'myproject_database_password';

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

ALTER ROLE myproject_user SET client_encoding TO 'utf8';

Затем установим схему изоляции транзакций по умолчанию на чтение с фиксацией, блокирующее чтение из незафиксированных транзакций:

ALTER ROLE myproject_user SET default_transaction_isolation TO 'read committed';

Установим часовой пояс. По умолчанию в проекте Django настроено использование UTC:

ALTER ROLE myproject_user SET timezone TO 'UTC';

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

GRANT ALL PRIVILEGES ON DATABASE myproject TO myproject_user;

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

\q

Теперь можем переходить к установке Django.

Шаг 3: установка Django в виртуальной среде

Для большей гибкости установим Django и все его зависимости в виртуальной среде Python. 

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

sudo pip install virtualenv

Затем создадим каталог для хранения проекта Django:

mkdir ~/myproject

И переместимся в каталог:

cd ~/myproject

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

python3 -m virtualenv myprojectenv

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

Прежде чем устанавливать приложения в виртуальной среде, её нужно активировать. Это можно сделать с помощью команды:

source myprojectenv/bin/activate

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

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

pip install Django psycopg2

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

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

django-admin startproject myproject .

Шаг 4: настройка параметров базы данных Django

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

nano ~/myproject/myproject/settings.py

В нижней части файла есть раздел DATABASES, который в настоящее время настроен на использование SQLite:

. . .

# Database
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

. . .

Нужно изменить это, чтобы использовать Postgres.

Во-первых, изменим движок так, чтобы он использовал адаптер postgresql вместо серверной части sqlite3. В качестве NAME укажем имя базы данных. Затем добавим учётные данные для входа — имя пользователя, пароль и хост для подключения. Параметр port оставим пустым, чтобы было выбрано значение по умолчанию:

. . .
# Database
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases

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

. . .

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

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

Добавим доменные имена и IP-адреса сервера Django следующим образом: ALLOWED_HOSTS = [ 'your_domain', '203.0.113.5']. Если хотите ответить на your_domain и любые поддомены, начните домен с точки .: ALLOWED_HOSTS = ['.your_domain', '203.0.113.5'].

Например:

. . .

ALLOWED_HOSTS = ['your_server_domain_or_IP']
. . .

Когда закончите, сохраните и закройте файл. Если используете nano, нажмите CTRL+X, затем y и затем ENTER.

Шаг 5: миграция базы данных и тестирование проекта

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

cd ~/myproject

Затем выполним и применим миграцию:

python manage.py makemigrations
python manage.py migrate

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

python manage.py createsuperuser

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

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

sudo ufw allow 8000

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

python manage.py runserver 0.0.0.0:8000

В веб-браузере перейдём на доменное имя или IP-адрес сервера, за которым следует :8000:

http://server_domain_or_IP:8000

5cbde28c47895d4d93ef1a4e73e54ac7.png

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

fb3ef17d760d4c7d9909a570db628beb.png

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

cf6788735206c3fc57670cf9699af331.png

Чтобы остановить сервер разработки, нажмите CTRL + C в окне терминала.

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

Заключение

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

b01dae3cadbadd73a37887cd1f760271.jpg

«Python-разработчик»

© Habrahabr.ru