?
Мы все знаем, что 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
Вот и все, вы загрузили все 3 контейнера, базу данных, pgAdmin и ваше собственное приложение, и все это в установке, которую легко настроить и внедрить новые инструменты.
Если вы сомневаетесь, «как я могу получить доступ к своему приложению с помощью docker?», то просто, с Docker вы можете делать все!
Первый тип:
docker ps
Возьмите id вашего контейнера и:
docker exec -it id_of_container bash
Вот и все, вы можете разработать свое приложение простым способом 🙂
Теперь мы можем увидеть результат!
Я надеюсь, что с помощью этого руководства я помог вам сделать ваши Django приложения с особым оттенком.
Увидимся в следующий раз!