Проект на Django с множеством различных улучшений. Сделан в качестве тестового задания в сентябре 2023.
- Аутентификация пользователей по токену
- Разделение прав доступа пользователей к разным действиям (
permissions
) - Каждый пользователь может редактировать и удалять свои записи (свой пермишен)
- Наделение пользователей правами модерирования и администрирования
- Удобная панель администрирования, на русском (требует создание пользователя с правами администратора, средствами движка Django)
- Получение, создание, обновление и удаление записей
- Используется пагинация записей
- Просмотр и редактирование записей с rich-текстом в админке (
summernote
) - Импорт Примечательных мест из xlsx-файла с данными (путём отправки на эндпоинт,
openpyxl
) - Просмотр и редактирование Примечательных мест в админке (
tresuremap
) - Получение Сводки погоды в Примечательном месте (GET-запрос на эндпоинт,
pyowm
, нужен API-токен) - Просмотр Сводки погоды в админке с фильтром по дате снятия показаний
- Экспорт Сводки погоды в xlsx-файл с фильтром по Примечательному месту и дате снятия показаний (GET-запрос + query-параметры на эндпоинт,
xlsxWriter
) - Возможность выполнения периодических задач (
celery
) - Работает в
Docker
-контейнерах и вvenv
Для просмотра списка эндпоинтов просто перейдите на главную страницу проекта.
Структура записи:
"id": 3,
"thumbnail": "url",
"title": "Title",
"image": "url",
"text": "Text",
"date": "2023-09-04, 06:08:20",
"author": "admin"
Структура примечательного места:
"id": 1,
"title": "Birmingem",
"rating": 10,
"author": "admin",
"latitude": 52.484227,
"longitude": -1.691047
Структура сводки погоды:
"id": 31,
"temper": 15.2, # Температура по шкале Цельсия
"humidity": 87.0, # Влажность воздуха, в %
"pressure": 768, # Атмосферное давление, в мм ртутного столба
"wind_direction": 123, # Направление ветра, градусы
"wind_speed": 1.53, # Скорость ветра, в м/с
"place": "Birmingem", # Название места
"author": "admin" # Пользователь, автор запроса
Структура таблицы для импорта примечательных мест в xlsx:
title | latitude | longitude | rating |
---|---|---|---|
Berlin | 52.518368 | 13.374546 | 12 |
Paris | 48.856664 | 2.350803 | 14 |
Madrid | 40.418711 | -3.713149 | 16 |
Vienna | 48.206335 | 16.362918 | 20 |
Rome | 41.902653 | 12.495441 | 20 |
Структура таблицы экспорта сводок погоды за определенную дату в xlsx:
id | temper | humidity | pressure | wind_direction | wind_speed | place | author |
---|---|---|---|---|---|---|---|
17 | 19,78 | 68 | 759 | 110 | 2,57 | Birmingem | admin |
18 | 19,78 | 68 | 759 | 110 | 2,57 | Birmingem | admin |
19 | 17,91 | 78 | 760 | 60 | 2,06 | Birmingem | admin |
20 | 16,79 | 83 | 760 | 30 | 2,06 | Birmingem | admin |
21 | 16,65 | 83 | 760 | 30 | 2,06 | Birmingem | admin |
Для авторизации нужно послать post-запрос на эндпоинт token
с json-параметрами вида
{
"username": "admin",
"password": "admin"
}
Для последующей аутентификации нужно добавлять в запросы HTTP-заголовок вида:
Authorization: Token 72c5c4148399532c95b8e45c73280e007e9438c2
Чтобы получить погоду в примечательном месте в данный момент, нужно отправить GET-запрос на эндпоинт вида
/api/weather/current/{place_name}/
Чтобы получить xlsx-файл со сводками погоды в примечательном месте за определённую дату, нужно отправить GET-запрос на эндпоинт вида
/api/weather/current/{place_name}/?date=YYYY-MM-DD
Чтобы импортировать список примечательных мест из xlsx-файла, нужно отправить POST-запрос на эндпоинт
/api/place/import/
с добавлением HTTP-заголовка вида
Content-Disposition: attachment; filename=import.xlsx
- Python 3
- Django 4.2.4
- djangorestframework 3.14.0
- sorl-thumbnail 12.9.0
- sorl-thumbnail-serializer-field 0.2.1
- django-treasuremap 0.3.4
- django-summernote 0.8.20.0
- django-constance 3.1.0
- XlsxWriter 3.1.2
- openpyxl 3.1.2
- pyowm 3.3.0
- python-dotenv 1.0.0
- celery 5.3.4
- psycopg2-binary 2.9.9
- и их зависимости (описано в requirements.txt)
В корневой директории нужно создать файл .env
с переменными окружения для работы
по примеру файла .env.sample
Затем, запустить приложение в Docker-контейнерах:
docker compose up -d
Выполнить миграции в приложении Django
docker compose exec web python manage.py migrate
Создать суперпользователя для входа в админку
docker exec web python manage.py createsuperuser
Username (leave blank to use 'user'): # Придумайте логин (например, admin)
Email address: # укажите почту, опционально
Password: # придумайте пароль
Password (again): # повторите пароль
Superuser created successfully.
Сохранить статичные файлы
docker compose exec web python manage.py collectstatic
Админка будет доступна по http://localhost/admin/
Flower будет доступен по http://localhost/flower/
На машине должен быть установлен Python актуальной версии (тестировалось на 3.11).
Клонировать репозиторий на машину, с которой будет будет запускаться сервис
git clone https://github.com/andmerk93/django-test.git
Развернуть виртуальное окружение python в папке с проектом (django-test)
python3 -m venv venv
Активировать виртуальное окружение для linux/unix
source ./venv/bin/activate
Для Windows, должно быть разрешено выполнение скриптов Powershell
venv\Scripts\activate
С запущенным виртуальным окружением нужно выполнить установку требуемых компонентов
pip install -r ./django_test/requirements.txt
Для запуска нужно создать в корневой директории файл .env
с переменными окружения для работы
по примеру файла .env.sample
SECRET_KEY="django-insecure-secret-key"
OWM_API_KEY=API10005000500205
DJANGO_DEBUG=True
DB_ENGINE=движок БД, если DJANGO_DEBUG не указан
DB_NAME=имя инстанса БД
DB_USER=юзер БД
DB_PASSWORD=пароль
DB_HOST=адрес хоста
DB_PORT=порт
Затем, перейти в директорию django_test
, дальнейшие действия выполнять отсюда
cd .\django_test\
Выполнить миграции (из виртуального окружения)
python .\manage.py migrate
И запустить проект
python .\manage.py runserver 80
Тестовый сервер поднимется и будет доступен по http://localhost/
Для создания суперюзера нужно выполнить команду (из вирт. окружения) и следовать инструкциям
python .\manage.py createsuperuser
Для работы celery
нужно запустить базу данных Redis
в контйенере:
docker run -d -p 6379:6379 redis
Подключить обрабочик задач:
celery -A django_test worker --loglevel=info
Подключить планировщик периодических задач:
celery -A django_test beat --loglevel=info
- django-celery-beat
- auto swagger
- proxy для flower