Установка проекта Django с помощью Docker

?

Мы все знаем, что Django отлично подходит для приложений, даже если мы этого хотим, с Docker разговор становится еще лучше!

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

Заинтересовались? Тогда читайте дальше, а остальное предоставьте мне.

Требования

  • Python
  • Docker

Начало работы ✅

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

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

1 — Сначала мы запускаем среду venv.

python -m venv venv && source ./venv/bin/activate
Входим в полноэкранный режим Выйти из полноэкранного режима

2 — Теперь мы установим наши зависимости (и не волнуйтесь, я расскажу вам, что каждая из них будет делать).

pip install django black python-dotenv psycopg2-binary
Войти в полноэкранный режим Выйти из полноэкранного режима

И не забудьте создать файлы зависимостей:

pip freeze > requirements.txt
Войти в полноэкранный режим Выйти из полноэкранного режима
  • Django —> Наш основной фреймворк
  • black —> Форматировщик кода Python
  • python-dotenv —> Python-dotenv читает пары ключ-значение из файла .env и может устанавливать их как переменные окружения.
  • psycopg2-binary —> самый популярный адаптер базы данных PostgreSQL для Python.

Советы:

  • Для MySQL, MariaDB и производных типов используйте mysqlclient.

3 — Давайте инициализируем наше приложение:

django-admin startproject your_fantastic_name .
Войдите в полноэкранный режим Выход из полноэкранного режима

4 — Создание файла .env:

Перейдите в корень рабочего пространства и создайте файл .env с такими значениями:

# App

SECRET_KEY=your_ultra_secret_key
# 1 = True or 0 = False
DEBUG=
# localhost 127.0.0.1 0.0.0.0 ...
HOSTS=

# POSTGRES
POSTGRES_DB=
POSTGRES_USER=
POSTGRES_PASSWORD=

# PGADMIN
PGADMIN_DEFAULT_EMAIL=
PGADMIN_DEFAULT_PASSWORD=
Войти в полноэкранный режим Выйти из полноэкранного режима

позже эти значения будут полезны

5 — Настройка нашего приложения:

Сначала перейдем к ядру нашего приложения, расположенному в файле settings.py, и добавим некоторые импорты.

По умолчанию Path уже импортирован, но для использования нашего пакета python-dotenv добавим еще два импорта:

# settings.py
from pathlib import Path
from dotenv import load_dotenv

import os
Вход в полноэкранный режим Выход из полноэкранного режима

И чуть ниже мы будем использовать os для настройки проекта:

# settings.py

load_dotenv()
BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = os.getenv("SECRET_KEY")
DEBUG = int(os.getenv("DEBUG", default=0))
ALLOWED_HOSTS = os.getenv("HOSTS").split(" ")
Вход в полноэкранный режим Выход из полноэкранного режима

Советы 2:

  • Для тех, кто собирается использовать Django с html и css, я предпочитаю помещать все статические файлы в папку templates.
# settings.py
TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [os.path.join(BASE_DIR, "templates")],
        "APP_DIRS": True,
        "OPTIONS": {
            "context_processors": [
                "django.template.context_processors.debug",
                "django.template.context_processors.request",
                "django.contrib.auth.context_processors.auth",
                "django.contrib.messages.context_processors.messages",
            ]
        },
    }
]
Войти в полноэкранный режим Выйти из полноэкранного режима
  • Для тех, кто собирается использовать Rest-Framework, вот мои настройки для приложения:
# settings.py
REST_FRAMEWORK = {
    "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.LimitOffsetPagination",
    "PAGE_SIZE": 5,
    "DEFAULT_RENDERER_CLASSES": ["rest_framework.renderers.JSONRenderer"],
    "DEFAULT_PARSER_CLASSES": [
        "rest_framework.parsers.JSONParser",
        "rest_framework.parsers.FormParser",
    ],
    "DEFAULT_THROTTLE_CLASSES": [
        "rest_framework.throttling.AnonRateThrottle",
        "rest_framework.throttling.UserRateThrottle",
    ],
    "DEFAULT_THROTTLE_RATES": {"anon": "15/min", "user": "20/min"},
}
Войти в полноэкранный режим Выйти из полноэкранного режима

6 — Настройка базы данных в Django:

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

# settings.py
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": os.getenv("POSTGRES_DB"),
        "USER": os.getenv("POSTGRES_USER"),
        "PASSWORD": os.getenv("POSTGRES_PASSWORD"),
        "HOST": "db",
        "PORT": 5432,
    }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Дополнительные советы:

  • Это необязательно, но рекомендуется, для хранения статических файлов и некоторых других конфигураций для языка и прочего:
# settings.py
LANGUAGE_CODE = "pt-BR"
TIME_ZONE = "America/Sao_Paulo"
USE_I18N = True
USE_TZ = True

STATIC_URL = "static/"
STATICFILES_DIRS = (os.path.join(BASE_DIR, "templates/static"),)
STATIC_ROOT = os.path.join("static")

MEDIA_URL = "media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "media")

DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
Войти в полноэкранный режим Выход из полноэкранного режима

Настройка Docker ?

Сначала нам нужен билд для нашего приложения, давайте создадим его!

# Image of python with Debian
FROM python:3.9-bullseye

# Set Workdir
WORKDIR /usr/src/app

# Envs for don't generate pycache
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Some important libs
RUN apt update && apt upgrade -y 
    && apt install gcc python3-dev musl-dev bash build-essential libssl-dev libffi-dev -y

# Upgrade pip, copy requirements and install all the project dependencies
RUN pip install --upgrade pip
COPY ./requirements.txt .
RUN pip install -r requirements.txt

# Entrypoint gonna be useful when we up the container
COPY entrypoint.sh .
RUN sed -i 's/r$//g' /usr/src/app/entrypoint.sh
RUN chmod +x /usr/src/app/entrypoint.sh

# Copy all the files for the root dir
COPY . .

ENTRYPOINT ["/usr/src/app/entrypoint.sh"]
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь нам нужен наш compose файл, чтобы поднять все инструменты и наше приложение:

version: "3"

services:
  web:
    build: .
    container_name: "web-app-server"
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/usr/src/app/
    ports:
      - 8000:8000
    networks:
      - postgres
    env_file:
      - ./.env
    depends_on:
      - db

  db:
    image: postgres:13.0-alpine
    container_name: "postgres-db-server"
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=${POSTGRES_DB}
    networks:
      - postgres
    env_file:
      - ./.env

  pgadmin:
    container_name: "pgadmin-django-server"
    image: dpage/pgadmin4
    environment:
      - PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL}
      - PGADMIN_DEFAULT_PASSWORD=${PGADMIN_DEFAULT_PASSWORD}
    volumes:
      - pgadmin:/root/.pgadmin
    ports:
      - "5050:80"
    networks:
      - postgres
    env_file:
      - ./.env
    depends_on:
      - db


volumes:
  postgres_data:
  pgadmin:

networks:
  postgres:
    driver: bridge
Войти в полноэкранный режим Выйти из полноэкранного режима

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

Если вы не уверены, какие значения определены в этом файле, выполните команду docker-compose config в терминале, она отобразит состав со всеми значениями.

И, наконец, наш файл точки входа

#!/bin/sh

# entrypoint.sh

# Verify if the database is connected
if [ "$DATABASE" = "postgres" ]
then
    echo "Waiting for postgres..."

    while ! nc -z $SQL_HOST $SQL_PORT; do
      sleep 0.1
    done

    echo "PostgreSQL started"
fi

# Delete all the tables
python manage.py flush --no-input
# Do a new migrate
python manage.py migrate

exec "$@"
Вход в полноэкранный режим Выйти из полноэкранного режима

Да, еще советы ?:

  • Для безопасности добавьте файл .dockerignore для исключения некоторых папок в сборке:
venv
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь давайте запустим наше приложение ?.

Все, что вам нужно, это просто дать небольшую команду:

docker-compose up
Enter fullscreen mode Выйти из полноэкранного режима

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

Если вы сомневаетесь, «как я могу получить доступ к своему приложению с помощью docker?», то просто, с Docker вы можете делать все!

Первый тип:

docker ps
Войти в полноэкранный режим Выйти из полноэкранного режима

Возьмите id вашего контейнера и:

docker exec -it id_of_container bash
Enter fullscreen mode Выйти из полноэкранного режима

Вот и все, вы можете разработать свое приложение простым способом 🙂

Теперь мы можем увидеть результат!

Я надеюсь, что с помощью этого руководства я помог вам сделать ваши Django приложения с особым оттенком.

Увидимся в следующий раз!

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *