{"id":24409293,"url":"https://github.com/belyashnikovatn/api_final_yatube","last_synced_at":"2026-04-20T20:34:43.281Z","repository":{"id":259172207,"uuid":"826200354","full_name":"belyashnikovatn/api_final_yatube","owner":"belyashnikovatn","description":"Сервис предназначен для платформы блогов, где можно создать и прокомментировать публикации.","archived":false,"fork":false,"pushed_at":"2024-10-27T13:48:29.000Z","size":129,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-13T09:40:21.962Z","etag":null,"topics":["api","django","djoser","drf","jwt","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/belyashnikovatn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-07-09T09:01:00.000Z","updated_at":"2024-10-27T13:50:43.000Z","dependencies_parsed_at":"2024-10-23T08:07:37.893Z","dependency_job_id":"0225a504-5a97-404e-91cf-3061fc098d1e","html_url":"https://github.com/belyashnikovatn/api_final_yatube","commit_stats":null,"previous_names":["belyashnikovatn/api_final_yatube"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/belyashnikovatn/api_final_yatube","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/belyashnikovatn%2Fapi_final_yatube","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/belyashnikovatn%2Fapi_final_yatube/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/belyashnikovatn%2Fapi_final_yatube/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/belyashnikovatn%2Fapi_final_yatube/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/belyashnikovatn","download_url":"https://codeload.github.com/belyashnikovatn/api_final_yatube/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/belyashnikovatn%2Fapi_final_yatube/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28061257,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-26T02:00:06.189Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","django","djoser","drf","jwt","python"],"created_at":"2025-01-20T05:56:22.645Z","updated_at":"2025-12-26T21:17:42.518Z","avatar_url":"https://github.com/belyashnikovatn.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Проект api_final_yatube\nЦель проекта – создать сервис api_yatube на основе технического задания.\nСервис предназначен для платформы блогов, где можно создать и прокомментировать публикации.  \n\n## Содержание\n- [Технологии](#технологии)\n- [Запуск проекта](#запуск-проекта)\n- [Задачи](#задачи)\n- [Функционал](#функционал)\n\n## Технологии:\nPython + Django REST Framework + аутентификация по JWT-токенам (при помощи библиотеки Djoser)\n\n## Запуск проекта:\n- $ python -m venv venv\n- $ source venv/Scripts/activate\n- $ python -m pip install --upgrade pip\n- $ pip install -r requirements.txt\n- $ cd yatube_api\n- $ python manage.py migrate\n- $ python manage.py runserver\n\n## Задачи:\n### Проектирование\nНа основе ТЗ доработала модель данных предыдущего проекта.\n![ERD](https://github.com/belyashnikovatn/api_final_yatube/blob/master/ERD_api_final.png)\n\u003cp\u003e\nНа основе ТЗ выбрала вьюсет, дополнительный функционал и пермишн.\u003c/p\u003e\n\n| Модель | Нужные методы | Вьюсет | Доп функционал | Разрешения\n| --- | --- | --- | --- | --- |\n| Post | get all, post one, patch one, put one, get one, delete one | ModelViewSet | Пагинация при получении списка (с limit и offset). Брать автора из request.user при записи| IsAuthenticatedOrReadOnly + проверка на авторство при NotReadOnly |\n| Comment | get all, post one, patch one, put one, get one, delete one | ModelViewSet | Запись автора из request.user, запись публикации из параметров запроса| IsAuthenticatedOrReadOnly + проверка на авторство при NotReadOnly |\n| Group | get all, get one | ReadOnlyModelViewSet | --- | IsAuthenticatedOrReadOnly |\n| Follow | get all, post one | CreateModelMixin + ListModelMixin + GenericViewSet | Поиск по подпискам при получении списка. Брать автора из request.user при записи. Валидаторы: 1. Пользователь может подписаться на другого пользователя 1 раз. 2. Пользователь не может подписаться сам на себя. | IsAuthenticated |\n\n### Реализация:\n- Подключила JWT-авторизацию (срок годности токена - 1 день);\n- Настроила разрешения на уровне проекта (IsAuthenticatedOrReadOnly), дополнительно указала у вьюсета для модели Follow (IsAuthenticated);\n- На уровне моделей добавила Group (группы для публикаций) и Follow (подписка пользователя на других пользователей), валидатор UniqueConstraint у модели Follow;\n- На уровне сериализаторов использовала из прошлого проекта PostSerializer, CommentSerializer, GroupSerializer, добавила FollowSerializator. В FollowSerializator использовала UniqueTogetherValidator, добавила собственный для проверки \"пользователь не может подписаться сам на себя\". У FollowSerializator поле 'following' представлено в виде SlugRelatedField для представления поля  'username' из связной модели User;\n- На уровне представлений использовала из прошлого проекта PostViewSet, CommentViewSet, GroupViewSet. При создании объекта (где это разрешено), автоматом подставляется автор [и публикация], при изменении/удалении происходит проверка на авторство. В PostViewSet настроила пагинацию класса LimitOffsetPagination. Добавила FollowCreateListViewSet для подписки, настроила поиск SearchFilter по подписке: search_fields = ('following__username',);\n- Создала и подключила разрешения;\n- Настроила urls для вьюсетов и для получения токена. \n\u003cbr\u003e\nВ ходе реализации тестировала через Postman. По итогу протестировала через pytest от ЯП и через коллекции в Postman. \n\n## Функционал\nДетальное описание методов сервиса находится в доке http://127.0.0.1:8000/redoc/ \n\u003cbr\u003e\nПримеры некоторых запросов:\n1. Получение токена \u003cbr\u003e\nЗапрос:\n```\nPOST http://127.0.0.1:8000/api/v1/jwt/create/ \n{\n  \"username\": \"string\",\n  \"password\": \"string\"\n}\n```\nОтвет:\n```\n{\n  \"refresh\": \"string\",\n  \"access\": \"string\"\n}\n```\n\n2. Список публикаций \u003cbr\u003e\nЗапрос:\n```\nGET http://127.0.0.1:8000/api/v1/posts/\n```\nили\n```\nGET http://127.0.0.1:8000/api/v1/posts/?offset=400\u0026limit=100\n```\nОтвет:\n```\n{\n  \"count\": 123,\n  \"next\": \"http://api.example.org/accounts/?offset=400\u0026limit=100\",\n  \"previous\": \"http://api.example.org/accounts/?offset=200\u0026limit=100\",\n  \"results\": [\n    {\n      \"id\": 0,\n      \"author\": \"string\",\n      \"text\": \"string\",\n      \"pub_date\": \"2021-10-14T20:41:29.648Z\",\n      \"image\": \"string\",\n      \"group\": 0\n    }\n  ]\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbelyashnikovatn%2Fapi_final_yatube","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbelyashnikovatn%2Fapi_final_yatube","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbelyashnikovatn%2Fapi_final_yatube/lists"}