Проект на 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