11# Title
2+
23Данный шаблон был разработан для одной цели - облегчения и повышения качества
34выполненых тестовых заданий в рамках ** FastAPI** .
45
56# Quick start
7+
68Для тех кто уже знаком с реализацией и всеми деталями - могут приступить к установке.
9+
710## Enviroments
11+
812Необходимо заполнить ** .env.sample** и в последствии перемеиновать его в ** .env**
13+
914``` python
1015# .env.sample
1116POSTGRES_PASSWORD = password # Пароль от базы данных (Настройка)
1217DB_PASSWORD = password # Пароль от базы данных (Использование)
1318TEST_POSTGRES_PASSWORD = password # Пароль от тестовой базы данный (Настройка)
1419TEST_DB_PASSWORD = password # Пароль от тестовой базы данных (Использование)
1520```
21+
1622## Docker
23+
1724Шаблон находится под системой управления и контеризации - ** Docker** .
1825Если у вас нет Docker - вы можете установить его с официального сайта: [ Docker] ( https://www.docker.com/get-started/ )
26+
1927- Вам необходимо сделать "Билд"
28+
2029``` bash
2130docker compose build
2231```
32+
2333- Вам необходимо запустить окружение
34+
2435``` bash
2536docker compose up
2637```
27- - После успешного запуска приложение будет доступно по адрессу: http://localhost:8080
28- - Grafana: http://localhost:3000
29- - Flower: http://localhost:5555
38+
39+ - После успешного запуска приложение будет доступно по адрессу: < http://localhost:8080 >
40+ - Grafana: < http://localhost:3000 >
41+ - Flower: < http://localhost:5555 >
3042
3143# View
44+
3245Обзор и детали данного шаблона
46+
47+ ## Users
48+
49+ В данном шаблоне реализован CRUD для пользователя с помощью библиотеки
50+ fastapi-users
51+
52+ ### End-points
53+
54+ ` USERS `
55+
56+ - < http://localhost:8080/api/v1/users/me > GET
57+ Получение текущего пользователя
58+ - < http://localhost:8080/api/v1/users/me > PATCH
59+ Изменение текущего пользователя
60+ - < http://localhost:8080/api/v1/users/{id} > GET
61+ Получение пользователя по ID Необходимо иметь права доступа уровня ` admin `
62+ - < http://localhost:8080/api/v1/users/{id} > PATCH
63+ Изменение пользоватея по ID Необходимо иметь права доступа уровня ` admin `
64+ - < http://localhost:8080/api/v1/users/{id} > DELETE
65+ Удаление пользоватея по ID Необходимо иметь права доступа уровня ` admin `
66+
67+ ` AUTH `
68+
69+ - < http://localhost:8080/api/v1/auth/jwt/login > POST
70+ Аутентификация в систему с последующим получением JWT для авторизации
71+ - < http://localhost:8080/api/v1/auth/jwt/logout > POST
72+ Вызод из системы
73+ - < http://localhost:8080/api/v1/auth/register > POST
74+ Регистрация нового пользователя
75+ - < http://localhost:8080/api/v1/auth/request-verify-token > POST
76+ Получение токена для верификации. ` ВАЖНО ` Читайте ниже, есть нюанс.
77+ - < http://localhost:8080/api/v1/auth/verify > POST
78+ Верификация пользователя по токену
79+ - < http://localhost:8080/api/v1/auth/forgot-password > POST
80+ Получение токена для изменения пароль. ` ВАЖНО ` Читайте ниже, есть нюанс.
81+ - < http://localhost:8080/api/v1/auth/reset-password > POST
82+ Изменения пароля посредством токена
83+
84+ ` ВАЖНО `
85+
86+ - < http://localhost:8080/api/v1/auth/forgot-password > POST
87+ Должен осуществлять логику отправки токена по эмеилу либо другим способом.
88+ В данный момент отправка осуществляется через ` консоль ` .
89+ Для деталей смотрите миксин ` api_v1/users/mixins/ActionUserManagerMixin `
90+ - < http://localhost:8080/api/v1/auth/forgot-password > POST
91+ Должен осуществлять логику отправки токена по эмеилу либо другим способом.
92+ В данный момент отправка осуществляется через ` консоль ` .
93+ Для деталей смотрите миксин ` api_v1/users/mixins/ActionUserManagerMixin `
94+
3395## Найболее используемые
96+
3497Найболее используемые конструкции с которыми приходится часто взаимодействовать.
98+
3599### Registration Routers
100+
36101- В каждом приложений необходимо инициализировать router
102+
37103``` python
38104# api/users/views.py
39105from fastapi import APIRouter
@@ -44,7 +110,9 @@ router = APIRouter(
44110 tags = [' Users' ],
45111 )
46112```
113+
47114- Затем зарегистрировать роутер
115+
48116``` python
49117# api_v1/routers.py
50118from api_v1.users.views import router as users
@@ -58,11 +126,14 @@ def register_routers(app: FastAPI) -> None:
58126 prefix = settings.API_PREFIX ,
59127 )
60128```
129+
61130После регистрации данные маршруты будут доступны.
62131
63132### Registration Logs
133+
64134- Логи захватывают все исключения возникшие в системе
65135и с помошью диспечиризации распределяется по нужным ** file.log**
136+
66137``` python
67138# app_includes/logs_errors.py
68139from fastapi import FastAPI
@@ -86,7 +157,9 @@ def register_errors(app: FastAPI) -> None:
86157 )
87158 return JSONResponse(response)
88159```
160+
89161- Если вы пишете пользовательское исключение например:
162+
90163``` python
91164from starlette.exceptions import HTTPException
92165
@@ -95,11 +168,14 @@ class ValidationError(HTTPException):
95168
96169pass
97170```
171+
98172То вам нужно его зарегистрировать как было показанно выше,
99173иначе logs не смогут выявить данное исключение и данные будут утеряны.
100174
101175### Registration Middlaware
176+
102177- Для регистрации Middlaware вам нужно добавить его в функцию
178+
103179``` python
104180from fastapi.middleware.cors import CORSMiddleware
105181from fastapi import FastAPI
@@ -119,10 +195,13 @@ def register_middlewares(app: FastAPI) -> None:
119195 allow_headers = [' *' ],
120196 )
121197```
198+
122199- При появлении новых middleware добавляйте их по порядку в эту функцию
123200
124201### Celery
202+
125203- Для регистрации task вам нужно создать файл с именем ** tasks.py** в вашем приложении:
204+
126205``` python
127206# api_v1/users/tasks.py
128207from config import celery_app
@@ -137,7 +216,9 @@ async def time_sleep_task():
137216 await asyncio.sleep(2.0 )
138217 return ' Task is done'
139218```
219+
140220- Затем добавить этот файл в список пакетов Celery
221+
141222``` python
142223# confin.celery.connection.py
143224
@@ -146,14 +227,17 @@ app.conf.broker_url = settings.rabbit.broker_url
146227# Регистрация до окружения где находится tasks.py
147228app.autodiscover_tasks(packages = [' api_v1.users' ])
148229```
230+
149231- После этих действий ваша task будет зарегистрирована
150232
151233### Test
234+
152235- Для тестирования у вас есть тестовая база данных, а так же
153236уже инициализированный отдельный клиент.
154237Cпособ реализации в ** api_v1/tests/conftest.py**
155238- Что бы написать тестовую функцию которой нужен доступ к API,
156239вам нужно использовать fixture - client.
240+
157241> [ !NOTE]
158242> Для асинхронных тестов используйте ** @pytest .mark.asyncio**
159243
@@ -169,7 +253,9 @@ async def test_get_user_error(client: AsyncClient):
169253 )
170254 assert response.status_code == 400
171255```
256+
172257- Для запуска используйте команду
258+
173259``` bash
174260pytest
175- ```
261+ ```
0 commit comments