Пет проект по типу инстаграм на Flask + Blueprints + Templates + тесты
- Инструменты pyenv и poetry.
- Python 3.10
- Устанавливаем виртуальное окружение и зависимости проекта:
poetry install
- Запускаем виртуальное окружение
poetry shell
- Запускаем проект
python app.py
В этом задании вам предстоит написать свой Instagram с едой, котами и еще раз едой!
Скопируйте репозиторий со всеми данными: https://github.com/skypro-008/coursework2_source
Вы найдете в нем список постов, картинки, шаблоны HTML и CSS-стили.
Переложите шаблоны в папку templates
.
Переложите стили и картинки в папку static
.
Обратите внимание: данные хранятся раздельно.
Посты вместе с информацией об авторе и его аватаркой хранятся в файле posts.json
, а комментарии хранятся в файле comments.json
. Также создан файл bookmarks.json
, где можно будет хранить закладки.
У каждого поста указаны:
poster_name
— имя/юзернейм автора поста,
poster_avatar
— аватарка автора поста,
pic
— картинка поста,
content
— текст поста,
views_count
— количество просмотров,
likes_count
— количество лайков,
pk
— id или номер поста.
Обратите внимание, количество комментариев не указано!
У каждого комментария указаны:
post_id
– к какому посту этот комментарий
commenter_name
– имя комментатора
comment
– текст комментария
pk
– идентификатор (номер) комментарий
Прежде, чем приступать к написанию Flask-приложения, полезно разработать функции, для работы с данными и сложить их в отдельном файле, например, utils.py.
Например:
get_posts_all()
– возвращает посты
get_posts_by_user(user_name)
– возвращает посты определенного пользователя. Функция должна вызывать ошибку ValueError
если такого пользователя нет и пустой список, если у пользователя нет постов.
get_comments_by_post_id(post_id)
– возвращает комментарии определенного поста. Функция должна вызывать ошибку ValueError
если такого поста нет и пустой список, если у поста нет комментов.
search_for_posts(query)
– возвращает список постов по ключевому слову
get_post_by_pk(pk)
– возвращает один пост по его идентификатору.
Напишите к каждой функции юнит тесты, расположите тесты в отдельной папке /tests
.
Организуйте тесты в виде классов или функций, на ваше усмотрение.
Создайте представление для всех постов, это должна быть главная страница.
GET
/
В нем должно показываться столько постов, сколько есть. Найдите и используйте подходящий шаблон. Замените в каждом шаблоне пути к файлу стилей и картинкам. Замените их на /static/img
и /static/css
соответственно!
Создайте представление для одного поста
GET /posts/<postid>
Получите комментарии из файла comments.json
, у которых соответствующий postid
.
Выведите комментарии к посту.
Не обрабатывайте теги – вы сделаете это в одном из следующих шагов.
Создайте представление для поиска по маршруту GET /search/?s=...
В нем должно отображаться 10 постов, если есть.
Поиск должен выполняться по вхождению ключевого слова в текст поста. Регистрозависимость на ваше усмотрение.
Найдите и используйте подходящий шаблон для вывода результатов.
Создайте представление с выводом постов конкретного пользователя GET /users/<username>
. Выведите те посты у которых poster name соответствует username
из запроса. Используйте шаблон user-feed
Добавьте обработчик запросов к несуществующим страницам, например /meow
и верните в этом случае статус-код 404.
Добавьте обработчик ошибок, возникших на стороне сервера (ошибка 500, Internal Server Error ) и верните в этом случае статус-код 500.
Создайте представление, которое обрабатывает запрос GET /api/posts
и возвращает полный список постов в виде JSON-списка.
Создайте представление, которое обрабатывает запрос GET /api/posts/<post_id>
и возвращает один пост в виде JSON-словаря.
Используйте стандартный logging, логи должны храниться в папке logs в файле api.log
. Формат логов должен быть таким:
%(asctime)s [%(levelname)s] %(message)s
Пример:
2022-03-18 18:48:56 [INFO]Запрос /api/posts
2022-03-18 18:48:57 [INFO]Запрос /api/posts
2022-03-18 18:48:58 [INFO]Запрос /api/posts/2
2022-03-18 18:48:59 [INFO]Запрос /api/posts/3
Протестируйте эндпоинт GET /api/posts
, проверьте, что
- возвращается список
- у элементов есть нужные ключи
Не проверяйте количество элементов в списке, так как оно может меняться
Протестируйте эндпоинт GET /api/posts/<post_id>
, проверьте, что
- возвращается словарь
- у элемента есть нужные ключи
Не проверяйте данные в полученном словаре, это не обязательно.
- Обработка данных их формы выполняется корректно
- Вывод нефильтрованного списка выполняется корректно
- Вывод фильтрованного списка выполняется корректно
- Работа с данными вынесена в функции или отдельный класс
- Данные фильтруются до передачи в шаблон, лишние данные в шаблон не передаются
Загрузить программу на гитхаб и приложить в дз на платформе Skypro ссылку на файл на гитхабе.