{"id":21546998,"url":"https://github.com/lexxai/goit_python_web_hw_13","last_synced_at":"2026-04-15T05:31:45.370Z","repository":{"id":208154186,"uuid":"720936809","full_name":"lexxai/goit_python_web_hw_13","owner":"lexxai","description":"GoIT, Python WEB, Homework number 13. FastAPI. PostgreSQL. Docker. REST API. ORM SQLAlchemy. Pydantic. Bootstraps CSS. Jinga. Alembic. OAuth2. JWT. Redis. Cloudinary. Limits","archived":false,"fork":false,"pushed_at":"2023-11-22T00:10:26.000Z","size":4285,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-20T08:11:18.836Z","etag":null,"topics":["cloduinary","docker","docker-compose","fastapi","fastapi-sqlalchemy","goit","homwork","jinja2","oauth2","postgresql","pydantic","python","redis","rest-api"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lexxai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null}},"created_at":"2023-11-20T02:20:54.000Z","updated_at":"2023-11-21T00:30:27.000Z","dependencies_parsed_at":"2025-10-21T10:17:28.274Z","dependency_job_id":null,"html_url":"https://github.com/lexxai/goit_python_web_hw_13","commit_stats":null,"previous_names":["lexxai/goit_python_web_hw_13"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/lexxai/goit_python_web_hw_13","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lexxai%2Fgoit_python_web_hw_13","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lexxai%2Fgoit_python_web_hw_13/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lexxai%2Fgoit_python_web_hw_13/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lexxai%2Fgoit_python_web_hw_13/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lexxai","download_url":"https://codeload.github.com/lexxai/goit_python_web_hw_13/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lexxai%2Fgoit_python_web_hw_13/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31828530,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T18:05:02.291Z","status":"online","status_checked_at":"2026-04-15T02:00:06.175Z","response_time":63,"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":["cloduinary","docker","docker-compose","fastapi","fastapi-sqlalchemy","goit","homwork","jinja2","oauth2","postgresql","pydantic","python","redis","rest-api"],"created_at":"2024-11-24T06:13:52.021Z","updated_at":"2026-04-15T05:31:45.353Z","avatar_url":"https://github.com/lexxai.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# goit_python_web_hw_13\nGoIT, Python WEB, Homework number 12. FastAPI. PostgreSQL. Docker. REST API. ORM SQLAlchemy. Pydantic. Bootstraps CSS. Jinga. Alembic. OAuth2. JWT. Redis. Cloudinary. Limits\n\n# Домашнє завдання №13\n## Перша частина\n\nУ цьому домашньому завданні ми продовжуємо доопрацьовувати застосунок REST API із домашнього завдання 12.\n\n### Завдання\n\n1.1. Реалізуйте механізм верифікації електронної пошти зареєстрованого користувача;\n\n1.2. Обмежуйте кількість запитів до своїх маршрутів контактів. Обов’язково обмежте швидкість - створення контактів для користувача;\n\n1.3. Увімкніть CORS для свого REST API;\n\n1.4. Реалізуйте можливість оновлення аватара користувача. Використовуйте сервіс Cloudinary;\n\n\n#### Загальні вимоги\n\n- Усі змінні середовища повинні зберігатися у файлі .env. Всередині коду не повинно бути конфіденційних даних у «чистому» вигляді;\n- Для запуску всіх сервісів і баз даних у застосунку використовується Docker Compose;\n\n#### Додаткове завдання\n\n1.5. Реалізуйте механізм кешування за допомогою бази даних Redis. Виконайте кешування поточного користувача під час авторизації;\n\n1.6. Реалізуйте механізм скидання пароля для застосунку REST API;\n\n## Друга частина\n\nУ цьому домашньому завданні необхідно доопрацювати застосунок Django із домашнього завдання 10.\n\n## Завдання\n\n2.1. Реалізуйте механізм скидання пароля для зареєстрованого користувача;\n\n2.2. Усі змінні середовища повинні зберігатися у файлі .env та використовуватися у файлі settings.py\n\n\n\n\n# Результати виконання завдань\n\n## Встановлення та запуск\n### Підготувати зміні оточення .env\nНа основі прикладів у теці [doc\\dot-env-example](doc\\dot-env-example) створити файли з Вашими індивідуальними даними:\n- .env  (визначає APP_ENV що визначає поточний робочий файл є prod, dev)\n- .env-dev (Налаштування для dev)\n- .env-prod (Налаштування для prod)\n### Режим Docker prod\n#### Docker app compose\nВиконати скрипт:\n```\ncd .\\scripts\ndocker_run_docker-compose.cmd\n```\nабо\n```\ndocker-compose --env-file .env-prod up -d \n```\n![](doc/docker-app-02.png)\n![](doc/docker-app-01.png)\n![](doc/healthcheck-01.png)\n\n#### Docker Hub url: https://hub.docker.com/r/lexxai/web_hw13\n\n### Режим dev\n#### Бази даних Docker compose\nВиконати скрипт:\n```\ncd .\\scripts\ndocker_run_db_compose.cmd\n```\nабо\n```\ndocker compose  --env-file .env-prod --file docker-compose-db.yml  up -d \ncd .\\hw13\nalembic upgrade head \n```\n\n#### FastAPI server\nВиконати скрипт:\n```\ncd .\\scripts\nrunserver.cmd\n```\nабо\n```\ncd .\\hw13\nuvicorn main:app --reload --port 9000\n```\nабо\n```\ncd .\\hw13\npython .\\main.py\n```\n\n\n### Відкрити сторінку браузера http://localhost:9000\n![](doc/index-01.png)\nFastAPI - Swagger UI\n![](doc/index-02.png)\nJavaScript easy client\n![](doc/index-03.png)\n\n## Етапи виконання \n\n## 1.1. Реалізуйте механізм верифікації електронної пошти зареєстрованого користувача\n\nРеєстрація\n![](doc/auth-emailconf-01.png)\n\nСпроба зайти, без підтвердження пошти\n![](doc/auth-emailconf-05.png)\n\nЛист підтвердження\n![](doc/auth-emailconf-02.png)\n\nПідтвердження за клац на посилання з листа\n![](doc/auth-emailconf-03.png)\n\nЗміна у базі даних\n![](doc/auth-emailconf-04.png)\n\nСпроба зайти, після підтвердження пошти\n![](doc/auth-emailconf-06.png)\n\n\n## 1.2. \n\n### Обмежуйте кількість запитів до своїх маршрутів контактів. \nPostman \n![](doc/limit-contacts-01.png)\n\n### Обмеження швидкісті - створення контактів для користувача\nPostman \n![](doc/limit-create-02.png)\n\nseed script\n![](doc/limit-create-01.png)\n\n\n## 1.3. CORS\nCORS ORIGIN ALLOW http://localhost:3001\n![](doc/cors-03.png)\n\nCORS ORIGIN DENY FOR http://localhost:3002\n![](doc/cors-01.png)\n\nCORS ORIGIN DENY FOR http://localhost:3002\n![](doc/cors-02.png)\n\nCORS ORIGIN ALLOW http://localhost:3002\n![](doc/cors-04.png)\n\nCORS ORIGIN ALLOWED FOR http://localhost:3002\n![](doc/cors-05.png)\n\n\n## 1.4. Avatar Cloudinary\nDefault Gravatar link\n![](doc/avatar-01.png)\n\nUpload new avatar to Cloudinary\n![](doc/avatar-02.png)\n\nDownload link of avatar from Cloudinary\n![](doc/avatar-03.png)\n\nUpdated link of avatar from Cloudinary on user profile\n![](doc/avatar-04.png)\n\n## 1.5. Механізм кешування за допомогою бази даних Redis. Кешування поточного користувача під час авторизації.\n![](doc/user-redis-01.png)\n\n\n\n## 2. Django із домашнього завдання 10\n\nПроєкт виконано за цим посиланням:\n\nhttps://github.com/lexxai/goit_python_web_hw_10/tree/addon-hw13\n\n(prepend) Django - https://github.com/lexxai/goit_python_web_django_lect_02_notes/tree/reset_password\n\n\n## 2.1 Django HW10\n### PASSWORD RESET\n![](doc/hw10/password-reset-06.png)\n\n![](doc/hw10/password-reset-05.png)\n\n![](doc/hw10/password-reset-01.png)\n\n![](doc/hw10/password-reset-02.png)\n\n![](doc/hw10/password-reset-03.png)\n\n![](doc/hw10/password-reset-04.png)\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flexxai%2Fgoit_python_web_hw_13","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flexxai%2Fgoit_python_web_hw_13","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flexxai%2Fgoit_python_web_hw_13/lists"}