Данный репозиторий содержит код написанный на python3 по заданию Артема. Задание заключалось в создании backend-кода (fronend предоставлен Devman), по реализации подобия Яндекс-Афиши.
Заказчик человек творческий и любознательный, побывал везде где только можно в своем родном городе (кстати, не факт...) и хочет поделиться со всеми своим опытом, а если повезёт - монетизировать проект.
Сайт представляет собой карту с указанием различных локаций, после выбора которой появляется подробное описание указанного места и различные рекомендации, почему это конкретное место может заинтересовать посетителя.
Для решения задачи создан Django-проект, подготовлено API для работы с данными, оптимизированна работа панели администратора.
Скачайте код, распакуйте его в виртуальном окружении. Установите пакет зависимостей:
pip install -r requirements.txt
Создайте файл переменных .env
для settings.py
в каталоге where_to_go
, пример:
# where_to_go/.env
SECRET_KEY="your_key"
STATIC_URL="/static_url/"
MEDIA_ROOT="media_folder/"
MEDIA_URL="/media_url/"
DEBUG= True or False
ВАЖНО: проверьте settings.py
, данные переменные указаны со значением по умолчанию.
Для работы сайта нужна наполненная база данных. В текущем случае по умолчанию используется стандартная SQLite база данных (БД) db.sqlite3
.
Примените миграции для БД:
python manage.py migrate
Запустите локальный сервер:
python manage.py runserver
Сайт будет доступен по локальному адресу:
127.0.0.1:8000
По просьбе Артема реализовано API, которое представляет собой ответ на http запрос
http://127.0.0.1:8000/places/[id локации]/
Ответ представлен в JSON формате:
title: заголовок локации
imgs:
0: относительный пусть к файлу изображения_0
1: относительный пусть к файлу изображения_1
...
description_short: краткое описание
description_long: полное описание
coordinates:
lat: широта
lng: долгота
Для работы с администраторской панелью не забудьте создать соответвующего пользователя:
python manage.py createsuperuser
После создания администратора перейдите по ссылке 127.0.0.1:8000/admin и введите пару логин/пароль.
В администраторской панели представлено приложение PLACES
(да, да, те самые локации), в котором две модели
Image
и собственноо Place
.
Модель Image
довольно скушная.., позволяет добавить картинку, привязать ее к определенной локации. Дополнительные поля Позиция
и Описание
вряд ли будут использоваться, потому как Позиция
доступна через основную модель Place
(и лучше именно там ее пользовать) , а
Описание
нигде не применяется, необязательно и вообще служит простым информационным полем для увлекательной работы контент-менеджера. Зато, мы обеспечили
контент-менеджеру личное пространство, здорово же...
Модель Place
гораздо интереснее - это сердце сайта. Модель содержит детализированную информацию об определенной локации (локации, где советует побывать автор).
В первую очередь модель позволяет создать новую локацию и с помощью следующих полей дать ей подробное описание:
Название
- краткое название локации;Короткое описание
- это первое описание локации, которое увидит посетитель сайта;Полное описание
- несложно догадаться о назначении; в поле реализован редактор текста;Долгота
- это долгота;Широта
- это недолгота.
Дальше, тоже интересно... располагаются картинки привязанные к конкретной локации, картинку можно двигать (изменять порядок отображения), не говоря уже о добавлении и удалении. Так что,
CRUD
для нас не пустой звук. Все тоже самое можно делать с локацией целиком.
Пожалуйста, не забывайте нажимать Save
после всех изменений.
На хостинге pythonanywhere.com
развернут пример работы сайта Афиши.
Сайт доступен по адресу:
http://sam1808.pythonanywhere.com/
Панель администратора:
https://sam1808.pythonanywhere.com/admin/
Связка логин/пароль:
user
super
Сайт абсолютно не соответвует критериям безопасности, запущен с ключами по умолчанию, служит исключительно для демонстрации возможностей и тестов.
В базу данных вручную добавлены несколько локаций, вы можете проверить работу API, например для первой локации (id=1), по ссылке:
https://sam1808.pythonanywhere.com/places/1/
Сайт размещен под бесплатным аккаунтом, если сайт не доступен, то:
- сработало ограничение бесплатного аккаунта по нагрузке (попробуйте завтра);
- хостер проводит работы (попробуйте сегодня);
- проводятся работы по обновлению сайта (попробуйте прям сейчас);
- все удалено в связи с неактуальностью (такое тоже бывает);
- поломались ресурсы, на которые ссылается сайт (будем лечить).
Контент-менеджеры - пчелы,
Никогда и нипочем бы,
Ни за что бы не подумали,
Как же важен бедных... труд...
По просьбе Артема облегчаем труд контент-менеджеров, а именно - подготовлена специальная managment команда load_place
.
Синтаксис простой:
python manage.py load_place [URL на JSON-файл локации]
Запускаем с консоли сервера, при этом URL
- опция обязательная, без нее система сообщит об ошибке.
С данными любезно делятся, обратите внимание, что вам нужен чистый JSON файл, например Антикафе Bizone.json
будет доступно по кнопке RAW
и выглядит вот так, а команда загрузки на сервер, вот так:
python manage.py load_place https://raw.githubusercontent.com/devmanorg/where-to-go-places/master/places/%D0%90%D0%BD%D1%82%D0%B8%D0%BA%D0%B0%D1%84%D0%B5%20Bizone.json
Сообщение о создание локации в консоли сервера, например,
Created location: Смотровая площадка PANORAMA360 в ММДЦ «Москва-Сити»
говорит о том, что локация успешно создана. В случае если такая локация уже есть, консоль и об этом скажет.
Скрипт проверяет http(s) запросы на предмет доступности. В случае недоступности данных/ошибки в запросе, скрипт сообщит причину и детали ошибки.