Создание проекта
Установить необходимо огромное количество библиотек. Создадим файл requirements.txt
со следующим содержимым:
Django==4.2.7
django-cors-headers==4.3.0
djangorestframework==3.14.0
djangorestframework-simplejwt==5.3.0
django-allauth==0.58.1
dj-rest-auth==5.0.1
dj_database_url==2.1.0
drf-spectacular==0.26.5
gunicorn==21.2.0
psycopg[c]==3.1.12
python-dotenv==1.0.0
starlette==0.31.1
Чуть подробнее о каждой библиотеке:
Django
- сам веб-фреймворк, который мы будем использовать;django-cors-headers
- настройка CORS;djangorestframework
- библиотека для REST API с использованием Django;djangorestframework-simplejwt
- управление JWT токенами с помощью DRF;django-allauth
+dj-rest-auth
- удобная авторизация с помощью API, в том числе с помощью различных сторонних провайдеров (включая OIDC, который мы и будем использовать);dj_database_url
- парсер БД-URL в настройки Django;drf-spectacular
- Swagger для DRF;gunicorn
- популярный веб-сервер, с помощью которого и будем запускать наш бэкенд;psycopg[c]
- адаптер для PostgreSQL;python-dotenv
+starlette
- удобное управление переменными окружения;
Теперь установим все библиотеки следующей командой:
Создадим проект laboratory_work_3
и сразу несколько приложений:
django-admin startproject laboratory_work_3
cd laboratory_work_3
python manage.py startapp adapter
python manage.py startapp oidc
python manage.py startapp survey
Приложение adapter
будет представлять минимально необходимое взаимодействие с адаптерами.
Приложение oidc
будет отвечать за авторизацию с помощью OIDC ITMO.ID.
В приложении survey
будет всё взаимодействие с опросом.
Немного изменим структуру проекта и добавим некоторые файлы для удобного взаимодействия и дальнейшего деплоя:
.
├─ src/
│ ├─ apps/
│ │ ├─ adapter/
│ │ ├─ oidc/
│ │ ├─ survey/
│ │ └─ __init__.py
│ ├─ delivery/
│ │ ├─ __init__.py
│ │ ├─ asgi.py
│ │ ├─ gunicorn.conf.py
│ │ ├─ urls.py
│ │ └─ wsgi.py
│ ├─ manage.py
│ └─ settings.py
├─ .env
├─ docker-compose.yml
├─ Dockerfile
└─ requirements.txt
Все файлы основные файлы проекта мы перенесли в директорию src
, это будет отправная точка для создания docker образа.
Файлы проекта, отвечающие за поднятие сервера перенесли в отдельную директорию delivery
и добавили туда файл настроек
для gunicorn.
Приложения перенесли в отдельную директорию apps
.
Теперь перейдём в файл settings.py
и настроим все наши приложения и библиотеки:
-
Загрузим переменные окружения и будем использовать их значения для важных настроек (важно не забыть указать их в
.env
файле):load_dotenv() env = Config(".env") # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = env("SECRET_KEY", cast=str) # SECURITY WARNING: don't run with debug turned on in production! DEBUG = env("DEBUG", cast=bool, default=False) ALLOWED_HOSTS = list(env("ALLOWED_HOSTS", cast=CommaSeparatedStrings, default=[])) CSRF_TRUSTED_ORIGINS = list(env("CSRF_TRUSTED_ORIGINS", cast=CommaSeparatedStrings, default=[]))
-
Добавим все библиотеки и приложения в
INSTALLED_APPS
:INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "rest_framework", "rest_framework.authtoken", "drf_spectacular", "dj_rest_auth", "django.contrib.sites", "allauth", "allauth.account", "dj_rest_auth.registration", "allauth.socialaccount", "allauth.socialaccount.providers.openid_connect", "apps.oidc", "apps.adapter", "apps.survey", ]
-
Добавим ID сайта (который далее создадим в админ-панели):
-
Добавим мидлварь для CORS первым элементом (важно) и мидлварь для авторизации:
MIDDLEWARE = [ "corsheaders.middleware.CorsMiddleware", "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.common.CommonMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", "allauth.account.middleware.AccountMiddleware", ]
-
Настройки для CORS будем так же брать из переменных окружения:
-
Поменяем путь до файла
url.py
, потому что мы изменили структуру проекта: -
Также изменим путь до
wsgi.py
: -
Получим ссылку на БД из переменных окружения (рекомендуется использовать PostgreSQL) и будем использовать SQLite, если в
.env
ничего не указано.
Распарсим эту ссылку и используем в настройках БД: -
Поменяем язык на русский:
-
Помянем часовой пояс на GMT+3:
-
Поменяем хранилище для статических файлов:
-
Укажем пути хранения статических файлов:
-
Настроим логгер:
-
Настроим DRF:
В качестве класса для авторизации укажемJWTCookieAuthentication
из библиотекиdj_rest_auth
.
Все ответы API будем выводить в виде JSON, используя класс по умолчаниюJSONRenderer
.
Схемой для документации укажемdrf_spectacular
.
Настроим тротлинг до 20 запросов в минуту.REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES": ("dj_rest_auth.jwt_auth.JWTCookieAuthentication",), "DEFAULT_RENDERER_CLASSES": ("rest_framework.renderers.JSONRenderer",), "DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema", "DEFAULT_THROTTLE_CLASSES": [ "rest_framework.throttling.AnonRateThrottle", "rest_framework.throttling.UserRateThrottle", ], "DEFAULT_THROTTLE_RATES": {"anon": "20/minute", "user": "20/minute"}, }
-
Настроим кэш, который необходим для работы тротлинга:
-
Укажем время жизни JWT токенов:
-
Настроим
dj_rest_auth
: -
Получим Client ID для клиента ITMO.ID из переменной окружения:
-
Настроим
django-allauth
: -
Настроим Swagger:
-
Получим ссылки на бэкенд и фронтенд из переменных окружения: