Code Docs
fastapi_accelerator.auth_jwt
Модуль для аутентификации по JWT
BaseAuthJWT
Пример:
class AuthJWT(BaseAuthJWT):
async def check_auth(username: str, password: str) -> bool:
"""Проверка введенного логина и пароля."""
return username == "admin" and password == "admin"
async def add_jwt_body(username: str) -> dict:
"""Функция для добавление дополнительных данных в JWT токен пользователя"""
return {"version": username.title()}
# Подключить аутентификацию по JWT
AuthJWT.mount_auth(app)
Пример защиты API метода:
@app.get("/cheack_protected", summary="Проверить аутентификацию по JWT")
async def protected_route(jwt: dict = Depends(jwt_auth)):
return {"message": "This is a protected route", "user": jwt}
Source code in fastapi_accelerator/auth_jwt.py
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | |
add_jwt_body(username) abstractmethod async
Функция для добавление дополнительных данных в JWT токен пользователя
Source code in fastapi_accelerator/auth_jwt.py
60 61 62 | |
check_auth(username, password) abstractmethod async
Проверка введенного логина и пароля.
Source code in fastapi_accelerator/auth_jwt.py
55 56 57 58 | |
mount_auth(app) classmethod
Подключение аутентификации по JWT
Source code in fastapi_accelerator/auth_jwt.py
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | |
jwt_auth(request, token=Depends(oauth2_scheme))
Depends для проверки JWT
Source code in fastapi_accelerator/auth_jwt.py
128 129 130 131 132 133 134 135 136 137 138 | |
fastapi_accelerator.cache
Работа с кеш Redis
cache_redis(cache_class, cache_ttl, cache=True)
Декоратор для кеширования ответов API в Redis.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
cache_class | BaseCache | Класс кеша для взаимодействия с Redis. | required |
cache_ttl | timedelta | Время жизни кеша. | required |
cache | bool | Флаг, включающий или отключающий кеширование. | True |
class ViewSetRetrieve(BaseViewSet):
def register_routes(self):
'''Регистраций API обработчиков'''
@self.router.get(f"{self.prefix}/{{item_uid}}", tags=self.tags)
@cache_redis(self.cache, self.cache_class, self.cache_ttl)
async def get_item(
request: Request,
item_uid: str = Path(...),
aorm: OrmAsync = Depends(AppOrm.aget_orm),
) -> self.pydantic_model:
response = await aorm.get(
select(self.db_model).filter(self._name_pk == item_uid)
)
return response
return get_item
Source code in fastapi_accelerator/cache.py
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | |
fastapi_accelerator.exception
custom_http_exception_handler(request, exc) async
Кастомный обработки исключений
Подключение:
from starlette.exceptions import HTTPException as StarletteHTTPException
app.exception_handler(StarletteHTTPException)(custom_http_exception_handler)
Source code in fastapi_accelerator/exception.py
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | |
fastapi_accelerator.middleware
log_request_response(request, call_next) async
Логировать время выполение API запроса
Подключение:
app.middleware('http')(log_request_response)
Source code in fastapi_accelerator/middleware.py
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | |
request_log_format(request, status_code, process_time=None)
Форматировать запрос в лог строку
Source code in fastapi_accelerator/middleware.py
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
options: show_source: true heading_level: 3
fastapi_accelerator.paginator
options: show_source: true heading_level: 3
fastapi_accelerator.timezone
Модуль для работы со временем и временными зонами
get_datetime_now(timezone)
Получить текущие время с учетом тайм зоны
Установка врменной зоны для проекта
app.state.TIMEZONE = moscow_tz
Source code in fastapi_accelerator/timezone.py
13 14 15 16 17 18 19 | |
fastapi_accelerator.utils
NoInstanceMeta
Bases: type
Нельзя создавать экземпляры этого класса
Source code in fastapi_accelerator/utils.py
44 45 46 47 48 | |
SingletonMeta
Bases: type
Мета класс для реализации паттерна Одиночка
Source code in fastapi_accelerator/utils.py
6 7 8 9 10 11 12 13 14 | |
run_async(async_function)
Синхронная обертка для асинхронного вызова
Source code in fastapi_accelerator/utils.py
56 57 58 | |
singleton(func)
Декоратор для реализации паттерна Одиночка
Пример использования:
@singleton
def CACHE_STATUS(app=None) -> bool:
return app.state.CACHE_STATUS
cache_status = CACHE_STATUS() or CACHE_STATUS(request.app)
Source code in fastapi_accelerator/utils.py
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | |
to_namedtuple(**kwargs)
Вернуть именованный кортеж
Source code in fastapi_accelerator/utils.py
51 52 53 | |
fastapi_accelerator.viewset
Модуль для высокоуровневой работы с API обработками используя подход ViewSet которые автоматизируют базовый CRUD функционал, и поваляют гибко переопределять логику ViewSet
AppOrm
Брать методы получения сессии из настроек APP DATABASE_MANAGER
Source code in fastapi_accelerator/viewset.py
30 31 32 33 34 35 36 37 38 39 40 | |
aget_orm(request) async classmethod
Метод получения сессии берем из настоек APP
Source code in fastapi_accelerator/viewset.py
33 34 35 36 37 38 39 40 | |
BaseViewSet
Bases: ABC
Source code in fastapi_accelerator/viewset.py
25 26 27 | |
GenericViewSet
from app.api.v1.schemas.file import File from app.models.file import File as FileDb
router = APIRouter()
class FileViewSet(FullViewSet): db_model = FileDb pydantic_model = File
router.views = [ FileViewSet().as_view(router, prefix="/file"), ]
Source code in fastapi_accelerator/viewset.py
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 | |
__str__()
Сформировать документацию для ViewSet
Source code in fastapi_accelerator/viewset.py
300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 | |
ViewSetCreate
Bases: BaseViewSet
Source code in fastapi_accelerator/viewset.py
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | |
create()
API обработки
Source code in fastapi_accelerator/viewset.py
134 135 136 137 138 139 140 141 142 143 144 145 | |
db_create(item, aorm) async
Функция для создание записи в БД.
Source code in fastapi_accelerator/viewset.py
147 148 149 | |
ViewSetDelete
Bases: BaseViewSet
Source code in fastapi_accelerator/viewset.py
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 | |
db_delete(item_id, aorm) async
Функция для удаления записи в БД
Source code in fastapi_accelerator/viewset.py
197 198 199 | |
delete()
API обработки
Source code in fastapi_accelerator/viewset.py
184 185 186 187 188 189 190 191 192 193 194 195 | |
ViewSetList
Bases: BaseViewSet
Source code in fastapi_accelerator/viewset.py
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | |
list()
Обработчик API
Source code in fastapi_accelerator/viewset.py
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | |
list_paginator()
Обработчик API с пагинацией
Source code in fastapi_accelerator/viewset.py
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | |
ViewSetUpdate
Bases: BaseViewSet
Source code in fastapi_accelerator/viewset.py
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 | |
db_update(item_id, item, aorm) async
Функция для обновление записи в БД
Source code in fastapi_accelerator/viewset.py
171 172 173 174 175 176 177 | |
update()
API обработки
Source code in fastapi_accelerator/viewset.py
156 157 158 159 160 161 162 163 164 165 166 167 168 169 | |
fastapi_accelerator.db
BaseDatabaseManager
Базовый класс для работы с РСУБД
Source code in fastapi_accelerator/db/dbsession.py
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | |
check_dev()
Проверять включенный режим разработки
Source code in fastapi_accelerator/db/dbsession.py
49 50 51 52 | |
BaseOrm
Source code in fastapi_accelerator/db/dborm.py
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | |
delete(query) async
Удалить объекты по запросу
Source code in fastapi_accelerator/db/dborm.py
106 107 108 109 110 | |
get(query, deep=False, db_model=None) async
Получить объект по запросу
Source code in fastapi_accelerator/db/dborm.py
79 80 81 82 83 84 85 86 87 | |
get_list(query, deep=False, db_model=None) async
Получить список объектов по запросу
Source code in fastapi_accelerator/db/dborm.py
89 90 91 92 93 94 95 96 97 | |
update(query, update_data) async
Обновить объекты по запросу
Source code in fastapi_accelerator/db/dborm.py
99 100 101 102 103 104 | |
DatabaseAsyncSessionMixin
Bases: BaseDatabaseManager
Класс для асинхронной работы с РСУБД используя пул соединений
Source code in fastapi_accelerator/db/dbsession.py
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | |
aget_orm() async classmethod
Зависимость для получения сессии базы данных с транзакцией
Получить сессию:
async for orm in aget_orm(): yield orm
Source code in fastapi_accelerator/db/dbsession.py
141 142 143 144 145 146 147 148 149 150 151 | |
aget_session() async classmethod
Зависимость для получения сессии базы данных
Получить сессию:
async for asession in aget_orm(): yield asession
Source code in fastapi_accelerator/db/dbsession.py
129 130 131 132 133 134 135 136 137 138 139 | |
aget_session_transaction() async classmethod
Зависимость для получения сессию в транзакции
Получить сессию:
async for asession in aget_session_transaction(): yield asession
Source code in fastapi_accelerator/db/dbsession.py
153 154 155 156 157 158 159 160 161 162 163 164 | |
dispose() async classmethod
Метод dispose() закрывает все неиспользуемые соединения в пуле соединений, связанном с данным engine. Это позволяет освободить ресурсы базы данных, когда они больше не нужны
Source code in fastapi_accelerator/db/dbsession.py
173 174 175 176 177 178 179 | |
DatabaseSyncSessionMixin
Bases: BaseDatabaseManager
Класс для синхронной работы с РСУБД
Source code in fastapi_accelerator/db/dbsession.py
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | |
clear_all(exclude_tables_name=None) classmethod
Отчистить данные во всех таблицах
exclude_tables_name: Список имён таблиц которые не нужно отчищать
Source code in fastapi_accelerator/db/dbsession.py
111 112 113 114 115 116 117 118 119 120 121 122 123 | |
create_all() classmethod
Создать все таблицы в БД
Source code in fastapi_accelerator/db/dbsession.py
99 100 101 102 103 | |
drop_all() classmethod
Удалить все таблицы из БД
Source code in fastapi_accelerator/db/dbsession.py
105 106 107 108 109 | |
get_metadata() classmethod
Получаем обновленные метаданные
Source code in fastapi_accelerator/db/dbsession.py
92 93 94 95 96 97 | |
get_session() classmethod
Зависимость для получения сессии базы данных
Source code in fastapi_accelerator/db/dbsession.py
70 71 72 73 74 75 76 77 | |
get_session_transaction() classmethod
Зависимость для получения сессии базы данных с транзакцией
Source code in fastapi_accelerator/db/dbsession.py
79 80 81 82 83 84 85 86 87 88 89 90 | |
OrmAsync
Bases: OrmAsyncItem
Взаимодействие с БД
Source code in fastapi_accelerator/db/dborm.py
265 266 267 268 | |
OrmAsyncItem
Bases: BaseOrm
Логика для работы с одним элементом
Source code in fastapi_accelerator/db/dborm.py
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 | |
create_item(obj, deep=False) async
Создать объект
Source code in fastapi_accelerator/db/dborm.py
130 131 132 133 134 135 136 137 138 139 140 141 | |
delete_item(db_model, item_id, deep=False) async
Удалить объект по PK
Source code in fastapi_accelerator/db/dborm.py
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 | |
eager_refresh(obj) async
Жадно загрузить все связанные записи для данного объекта.
Source code in fastapi_accelerator/db/dborm.py
258 259 260 261 262 | |
get_item(db_model, item_id, deep=False) async
Получить объект по PK
Source code in fastapi_accelerator/db/dborm.py
116 117 118 119 120 121 122 123 124 125 126 127 128 | |
update_item(db_model, item_id, update_item, deep=False) async
Обновить объект по PK
Source code in fastapi_accelerator/db/dborm.py
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 | |
SingletonMeta
Bases: type
Мета класс для реализации паттерна Одиночка
Source code in fastapi_accelerator/utils.py
6 7 8 9 10 11 12 13 14 | |
deep_instance(db_model, pydantic_data)
Создает экземпляр SQLAlchemy модели из словаря. Если словарь содержит вложенные данные для связанных объектов, они также будут созданы.
Source code in fastapi_accelerator/db/dborm.py
38 39 40 41 42 43 44 45 46 47 48 49 50 51 | |
get_pk(db_model)
Получить первичный ключ у модели
Source code in fastapi_accelerator/db/dborm.py
54 55 56 | |
fastapi_accelerator.integration
ApiHTTP
Bases: NamedTuple
Stores API connection details and client.
Source code in fastapi_accelerator/integration/http_integration.py
31 32 33 34 35 36 37 38 | |
BaseIntegration
Базовый класс для интеграций
Source code in fastapi_accelerator/integration/base_integration.py
12 13 14 15 | |
BaseStabilityPattern
Базовый класс для реализации паттерна стабильности
Source code in fastapi_accelerator/integration/stability_patterns.py
64 65 66 67 68 69 70 71 72 73 74 75 76 | |
CircuitBreakerError
Bases: StabilityError
Ошибка, возникающая при срабатывании предохранителя.
Source code in fastapi_accelerator/integration/stability_patterns.py
29 30 31 32 33 34 35 36 37 | |
EndpointsDeclaration
Базовый класс для объявления интеграций с внешними API.
Этот класс предоставляет платформу для определения и управления интеграциями API, включая обработку аутентификации и настройку базового URL.
Source code in fastapi_accelerator/integration/http_integration.py
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 | |
Schema
Схема Pydantic для успешных ответов.
Эта схема описывает структуру данных, которые ожидаются в успешных ответах от REST API.
Source code in fastapi_accelerator/integration/http_integration.py
194 195 196 197 198 | |
SchemaError
Схема Pydantic для неуспешных ответов.
Эта схема описывает структуру данных, которые могут быть возвращены в случае ошибки при взаимодействии с REST API.
Source code in fastapi_accelerator/integration/http_integration.py
200 201 202 203 204 205 | |
__init__(base_url='', credentials=None)
Аргументы
base_url (URL): Базовый URL для API. Это может быть доменное имя или адрес в формате host:port. credentials (dict | None): Доступные учетные данные для аутентификации в внешней системе.
Примечание
Рекомендуется задавать base_url через переменные окружения, чтобы избежать проблем с конфигурацией на разных уровнях (например, на production-среде) из-за межсетевых экранов или других факторов.
Source code in fastapi_accelerator/integration/http_integration.py
181 182 183 184 185 186 187 188 189 190 191 192 | |
HTTPMethod
Bases: str, Enum
Доступные HTTP методы
Source code in fastapi_accelerator/integration/http_integration.py
21 22 23 24 25 26 27 28 | |
IntegrationHTTP
Bases: BaseIntegration
Класс для интеграции с сервисами REST API.
Этот класс используется для регистрации конечных точек в классе EndpointsDeclaration используя декоратор @endpoint. Это обеспечивает структурированный способ определения и интеграция с API.
Source code in fastapi_accelerator/integration/http_integration.py
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | |
docs: dict property
Получите документацию по этой интеграции.
endpoint(httpmethod, path, version, docurl)
Декоратор для интеграции REST-эндпоинтов с HTTP-запросами.
Этот декоратор применяется к методам класса, наследующего от IntegrationHTTP, и обеспечивает интеграцию с внешними REST-эндпоинтами через HTTP-запросы.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
path | str | Путь, на который отправляется запрос. | required |
version | str | Версия этого эндпоинта. | required |
docurl | str | Ссылка на документацию эндпоинта. | required |
httpmethod | HTTPMethod | Какой HTTP метод испольузеится. | required |
Returns:
| Type | Description |
|---|---|
Callable[[Callable[..., Awaitable[R]]], Callable[..., Awaitable[R]]] | Callable[..., Awaitable[R]]: Декорированная функция, готовая для интеграции с REST-эндпоинтом. |
Примечания
- Метод, к которому применяется декоратор, должен быть определен в классе, наследующем от
IntegrationHTTP - Для декорируемого метода должен быть указан возвращаемый тип аннотации.
- Обязательные аргументы должны быть указаны в декораторе.
Raises:
| Type | Description |
|---|---|
ValueError | Если для интеграционной функции не указан тип возвращаемого значения. |
TypeError | Вызыван метод не у экземпляра класса |
Source code in fastapi_accelerator/integration/http_integration.py
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | |
MaxRetriesExceededError
Bases: StabilityError
Ошибка, возникающая при превышении максимального числа попыток.
Source code in fastapi_accelerator/integration/stability_patterns.py
40 41 42 43 44 45 46 47 48 | |
StabilityError
Bases: Exception
Базовый класс для ошибок стабильности.
Source code in fastapi_accelerator/integration/stability_patterns.py
9 10 11 12 13 14 15 | |
StabilityTimeoutError
Bases: StabilityError
Ошибка, возникающая при превышении времени ожидания.
Source code in fastapi_accelerator/integration/stability_patterns.py
18 19 20 21 22 23 24 25 26 | |
ThrottlingError
Bases: StabilityError
Ошибка, возникающая при превышении лимита запросов.
Source code in fastapi_accelerator/integration/stability_patterns.py
51 52 53 54 55 56 57 58 | |
sp
Содержит в себе классы реализующие паттерны стабильности.
Рекомендуемый порядок применения паттернов стабильности:
Fallback должен быть самым внутренним, так как он предоставляет альтернативное поведение в случае сбоя основной функции.
Fallback(alternative_func)
Timeout следует применять сразу после Fallback, чтобы ограничить время выполнения как основной функции, так и резервной.
Timeout(seconds=timeout_seconds)
CircuitBreaker идет следующим, чтобы предотвратить повторные вызовы, если функция постоянно завершается неудачно или по таймауту.
CircuitBreaker(fail_threshold, reset_timeout)
Retry следует за CircuitBreaker, чтобы попытаться выполнить операцию несколько раз, если CircuitBreaker позволяет это.
RetryPattern(max_attempts=max_attempts, delay=timedelta(seconds=delay_seconds))
Throttling применяется в последнюю очередь, чтобы ограничить частоту вызовов всей обёрнутой функциональности.
Throttling(calls_per_second=calls_per_second)
Source code in fastapi_accelerator/integration/stability_patterns.py
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 | |
CircuitBreaker
Bases: BaseStabilityPattern
(Предохранитель) - Отслеживает количество ошибок при вызове внешнего сервиса. При превышении лимита временно блокирует вызов, предотвращая каскадные сбои.
Состояния Circuit Breaker:
-
Close - Идет передача запросов между сервисами и подсчет количества сбоев. Если число сбоев за заданный интервал времени превышает пороговое значение, выключатель переводится в состояние Open.
-
Open - Запросы от исходного сервиса немедленно возвращаются с ошибкой. По истечении заданного тайм-аута выключатель переводится в состояние Half-Open.
-
Half-open - Выключатель пропускает ограниченное количество запросов от исходного сервиса и подсчитывает число успешных запросов. Если необходимое количество достигнуто, выключатель переходит в состояние Closed, если нет — возвращается в статус Open.
Source code in fastapi_accelerator/integration/stability_patterns.py
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 | |
__init__(fail_threshold=3, reset_timeout=10)
fail_threshold: Пороговое значения числа сбоев reset_timeout: Период сброса подсчета количества сбоев
Source code in fastapi_accelerator/integration/stability_patterns.py
157 158 159 160 161 162 163 164 165 166 | |
Fallback
Bases: BaseStabilityPattern
(Резервный вариант) - Предоставляет альтернативный путь выполнения в случае сбоя основного. Позволяет системе деградировать контролируемо, а не падать с ошибкой.
Source code in fastapi_accelerator/integration/stability_patterns.py
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | |
__init__(alternative_func)
alternative_func: Функция которая вызолится при возникновение исключения
Source code in fastapi_accelerator/integration/stability_patterns.py
110 111 112 113 114 | |
RetryPattern
Bases: BaseStabilityPattern
(Паттерн повторения) - Автоматически повторяет запрос при возникновении временной ошибки.
Source code in fastapi_accelerator/integration/stability_patterns.py
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 | |
__init__(max_attempts=3, delay=timedelta(seconds=1))
max_attempts: Сколько раз попытаться повторить запрос delay: Задержка между попытками запросов
Source code in fastapi_accelerator/integration/stability_patterns.py
194 195 196 197 198 199 200 201 202 | |
Throttling
Bases: BaseStabilityPattern
(Регулирование) - Ограничивает количество запросов к ресурсу для предотвращения его перегрузки. Защищает систему от шторма запросов.
Source code in fastapi_accelerator/integration/stability_patterns.py
215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 | |
__init__(calls_per_second=1000)
calls_per_second: Сколько разрешено запросов в секунду
Source code in fastapi_accelerator/integration/stability_patterns.py
219 220 221 222 223 224 225 | |
Timeout
Bases: BaseStabilityPattern
(Тайм-аут) - Ограничивает время ожидания ответа от внешнего сервиса. Предотвращает блокировку ресурсов при зависании вызова.
Source code in fastapi_accelerator/integration/stability_patterns.py
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | |
__init__(seconds=10)
seconds: Через сколько секунд прервать выполнение запроса
Source code in fastapi_accelerator/integration/stability_patterns.py
126 127 128 129 130 | |
convert_response(rtypes, data)
Конвертирует входные данные в модель Pydantic или список моделей.
Эта функция пытается преобразовать входные данные в указанный тип или типы. Она поддерживает одиночные типы, Union типы, и списки типов.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
rtypes | GenericAlias | Ожидаемый тип или типы ответа. Может быть одиночным типом или Union из нескольких типов. | required |
data | Union[dict, list] | Данные для конвертации. Могут быть словарем или списком. | required |
Returns:
| Type | Description |
|---|---|
Union[Any, BaseModel, List[BaseModel]] | Union[dict, list, BaseModel, List[BaseModel]]: Сконвертированные данные. |
Union[Any, BaseModel, List[BaseModel]] | Если конвертация не удалась или не требовалась, возвращаются исходные данные. |
Raises:
| Type | Description |
|---|---|
ValidationError | Если все попытки конвертации завершились неудачно. |
Source code in fastapi_accelerator/integration/base_integration.py
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | |
wraper_endpoint(self_endpoint, func, url, version, httpmethod, *args, **kwargs) async
Выполнить метод с интеграцией
Примечание
Эта функция можно будет заменена во вемя тестирования, чтобы не делать реальные запросы. Для этого используйте фикстуру patch_integration
Source code in fastapi_accelerator/integration/http_integration.py
208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 | |
fastapi_accelerator.testutils
Пакет с логикой тестовых фикстур, который упрощают создания и поддержание тестов в FastAPi проекте
ApiHTTP
Bases: NamedTuple
Stores API connection details and client.
Source code in fastapi_accelerator/integration/http_integration.py
31 32 33 34 35 36 37 38 | |
BaseAuthJWT
Пример:
class AuthJWT(BaseAuthJWT):
async def check_auth(username: str, password: str) -> bool:
"""Проверка введенного логина и пароля."""
return username == "admin" and password == "admin"
async def add_jwt_body(username: str) -> dict:
"""Функция для добавление дополнительных данных в JWT токен пользователя"""
return {"version": username.title()}
# Подключить аутентификацию по JWT
AuthJWT.mount_auth(app)
Пример защиты API метода:
@app.get("/cheack_protected", summary="Проверить аутентификацию по JWT")
async def protected_route(jwt: dict = Depends(jwt_auth)):
return {"message": "This is a protected route", "user": jwt}
Source code in fastapi_accelerator/auth_jwt.py
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | |
add_jwt_body(username) abstractmethod async
Функция для добавление дополнительных данных в JWT токен пользователя
Source code in fastapi_accelerator/auth_jwt.py
60 61 62 | |
check_auth(username, password) abstractmethod async
Проверка введенного логина и пароля.
Source code in fastapi_accelerator/auth_jwt.py
55 56 57 58 | |
mount_auth(app) classmethod
Подключение аутентификации по JWT
Source code in fastapi_accelerator/auth_jwt.py
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | |
BaseAuthJwtPytest
Bases: BasePytest
Базовый класс для тестов с использованием pytest, который выполняет логику аутентификации для клиента по JWT
Source code in fastapi_accelerator/testutils/utils.py
170 171 172 173 174 175 176 177 178 179 180 181 182 | |
BasePytest
Базовый класс для тестов с использованием pytest.
Данный класс предоставляет методы для настройки и очистки состояния тестов. Наследуйте этот класс и называйте дочерний класс в формате:
class TestИмяКласса(BasePytest):
def setUp(self):
...
def test_метод_1(self):
...
Source code in fastapi_accelerator/testutils/utils.py
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | |
setUp()
Метод для выполнения необходимой настройки перед каждым тестом.
Этот метод может быть переопределен в дочернем классе для выполнения специфической настройки, необходимой для тестов.
Source code in fastapi_accelerator/testutils/utils.py
104 105 106 107 108 109 110 | |
setUpClass() classmethod
Метод для выполнения необходимой настройки перед всеми тестами в классе.
Этот метод может быть переопределен в дочернем классе для выполнения специфической настройки, необходимой для всех тестов в классе.
Source code in fastapi_accelerator/testutils/utils.py
141 142 143 144 145 146 147 148 | |
setup_class() classmethod
Вызывается перед выполнением всех тестовых методов в классе.
Этот метод вызывает setUpClass(), который может быть переопределен в дочернем классе для выполнения необходимой настройки перед всеми тестами в классе.
Source code in fastapi_accelerator/testutils/utils.py
131 132 133 134 135 136 137 138 139 | |
setup_method(method=None)
Вызывается перед выполнением каждого тестового метода.
Этот метод вызывает setUp(), который может быть переопределен в дочернем классе для выполнения необходимой настройки перед тестами.
:param method: Метод, который будет выполняться (тест).
Source code in fastapi_accelerator/testutils/utils.py
93 94 95 96 97 98 99 100 101 102 | |
tearDown()
Метод для выполнения необходимой очистки после каждого теста.
Этот метод может быть переопределен в дочернем классе для выполнения специфической очистки, необходимой после тестов.
Source code in fastapi_accelerator/testutils/utils.py
123 124 125 126 127 128 129 | |
tearDownClass() classmethod
Метод для выполнения необходимой очистки после всех тестов в классе.
Этот метод может быть переопределен в дочернем классе для выполнения специфической очистки, необходимой после всех тестов в классе.
Source code in fastapi_accelerator/testutils/utils.py
160 161 162 163 164 165 166 167 | |
teardown_class() classmethod
Вызывается после выполнения всех тестовых методов в классе.
Этот метод может быть переопределен в дочернем классе для выполнения необходимой очистки после всех тестов в классе.
Source code in fastapi_accelerator/testutils/utils.py
150 151 152 153 154 155 156 157 158 | |
teardown_method(method=None)
Вызывается после выполнения каждого тестового метода.
Этот метод вызывает tearDown(), который может быть переопределен в дочернем классе для выполнения необходимой очистки после тестов.
:param method: Метод, который был выполнен (тест).
Source code in fastapi_accelerator/testutils/utils.py
112 113 114 115 116 117 118 119 120 121 | |
EndpointsDeclaration
Базовый класс для объявления интеграций с внешними API.
Этот класс предоставляет платформу для определения и управления интеграциями API, включая обработку аутентификации и настройку базового URL.
Source code in fastapi_accelerator/integration/http_integration.py
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 | |
Schema
Схема Pydantic для успешных ответов.
Эта схема описывает структуру данных, которые ожидаются в успешных ответах от REST API.
Source code in fastapi_accelerator/integration/http_integration.py
194 195 196 197 198 | |
SchemaError
Схема Pydantic для неуспешных ответов.
Эта схема описывает структуру данных, которые могут быть возвращены в случае ошибки при взаимодействии с REST API.
Source code in fastapi_accelerator/integration/http_integration.py
200 201 202 203 204 205 | |
__init__(base_url='', credentials=None)
Аргументы
base_url (URL): Базовый URL для API. Это может быть доменное имя или адрес в формате host:port. credentials (dict | None): Доступные учетные данные для аутентификации в внешней системе.
Примечание
Рекомендуется задавать base_url через переменные окружения, чтобы избежать проблем с конфигурацией на разных уровнях (например, на production-среде) из-за межсетевых экранов или других факторов.
Source code in fastapi_accelerator/integration/http_integration.py
181 182 183 184 185 186 187 188 189 190 191 192 | |
HTTPMethod
Bases: str, Enum
Доступные HTTP методы
Source code in fastapi_accelerator/integration/http_integration.py
21 22 23 24 25 26 27 28 | |
MockRules
Source code in fastapi_accelerator/testutils/fixture_integration.py
15 16 17 18 19 20 21 22 23 24 25 | |
__init__(mock_rules)
Аргументы
mock_rules (dict[Callable, Callable]): Правила подмены методов интеграции на mock. Если в коде вызывается интеграция, которая не указана в mock_rules, возникает исключение. Это предотвращает случайные реальные запросы, если вы забыли указать mock.
Source code in fastapi_accelerator/testutils/fixture_integration.py
16 17 18 19 20 21 22 23 24 25 | |
SQLQueryTracker
Хранит трекер запросов в РСУБД
Source code in fastapi_accelerator/testutils/fixture_db/trace_sql.py
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | |
add(statement, params, executemany)
Добавить SQL команду в трекер
Source code in fastapi_accelerator/testutils/fixture_db/trace_sql.py
27 28 29 | |
SettingTest
Настройки для тестов
Пример app/conftest.py:
from app.core.config import TEST_DATABASE_URL
from fastapi_accelerator.db.dbsession import MainDatabaseManager
# Вы можете указать точный список импорта, это для простоты мы импортируем все
from fastapi_accelerator.testutils import * # noqa E402
from fastapi_accelerator.testutils import SettingTest
# Нужно создать менеджер БД до импорта APP
# чтобы паттерн одиночка создал только тестовое instance
# а в приложение уже взялся тестовый instance
TestDatabaseManager = MainDatabaseManager(
TEST_DATABASE_URL, echo=False, DEV_STATUS=True
)
from main import app # noqa E402
# Отключить кеширование во время тестов
app.state.CACHE_STATUS = False
SettingTest(TestDatabaseManager, app, alembic_migrate=True, keepdb=True)
Source code in fastapi_accelerator/testutils/fixture_base.py
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | |
__init__(DatabaseManager, app, alembic_migrate=False, keepdb=True)
alembic_migrate
Использовать ли для создания таблиц, миграции alembic, или сразу создавать конечный вариант таблиц лучше использовать alembic миграции, чтобы сразу проверять и их вов ремя тестирования - Если True -> использовать alembic миграции - Если False -> использовать create_all()
keepdb
- Если True -> не удалять тестовую БД после тестов
- Если False -> удалить тестовую БД после тестов
Source code in fastapi_accelerator/testutils/fixture_base.py
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | |
SingletonMeta
Bases: type
Мета класс для реализации паттерна Одиночка
Source code in fastapi_accelerator/utils.py
6 7 8 9 10 11 12 13 14 | |
TrackerNameTuple
Bases: NamedTuple
Хранит SQL команду
Source code in fastapi_accelerator/testutils/fixture_db/trace_sql.py
11 12 13 14 15 16 17 18 | |
apply_fixture_db(export_func, flush=False)
Декоратор, который добавляет фикстуры в БД перед тестом и удаляет их после теста.
:param export_func: Функция, возвращающая объекты для добавления в БД. :param flush: Удалить данные после выполнения теста, если установлено в True. Не нужно указывать если вы используете фикстуры client, так как он уже выполняет отчистку всех данных в common_setup_table
Пример:
def export_fixture_task() -> NamedTuple: return dict_to_namedtuple( file1=FileDb( uid=uuid.UUID("469d4176-98f3-48a2-8794-0e2472bc2b7e"), filename="file1.txt", size=100, format="text/plain", extension=".txt", ) )
@apply_fixture_db(export_fixture_task) def test_base(client: TestClient, fixtures: NamedTuple): response = client.get('url') assert response.status_code == 200 assert response.json() == {"uid": fixtures.file1.uid}
Source code in fastapi_accelerator/testutils/fixture_db/apply_fixture.py
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | |
check_response_json(response, exp_status_code, exp_json, exclude_list=None)
Проверка json API ответа
Пример:
def test_get_item(self, client: TestClient): response = client.get(self.url) check_response_json(response, 200, {...})
Source code in fastapi_accelerator/testutils/utils.py
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | |
client(common_client, common_clean_table)
Вернуть тестовый клиент FastAPI.
Source code in fastapi_accelerator/testutils/fixture_db/db.py
86 87 88 89 90 91 | |
client_auth_jwt(username=None)
Декоратор который аутентифицирует тестового клиента по JWT.
Использование в функции:
@client_auth_jwt(username="test"}) def test_get_list(client: TestClient): response = client.get(self.url) assert response.status_code == 200 assert response.json() == []
Использование в классе:
class TestTaskExecution(BasePytest):
@client_auth_jwt() # Данные для входа возьмутся из self.TEST_USER
def test_get_list(self, client: TestClient):
response = client.get(self.url)
assert response.status_code == 200
assert response.json() == []
Source code in fastapi_accelerator/testutils/fixture_auth.py
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | |
common_clean_table(common_setup_database)
Отчистка данных в таблицах, выполняется после каждого теста.
Source code in fastapi_accelerator/testutils/fixture_db/db.py
74 75 76 77 78 79 80 81 82 83 | |
common_client()
Создает тестовый клиент FastAPI.
Source code in fastapi_accelerator/testutils/fixture_db/db.py
66 67 68 69 70 71 | |
common_setup_database(engine)
Создает и настраивает тестовую базу данных один раз, на протяжение всех тестов.
Source code in fastapi_accelerator/testutils/fixture_db/db.py
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | |
db_session()
Получить сессию к тестовой БД
Source code in fastapi_accelerator/testutils/fixture_db/db.py
94 95 96 97 98 | |
fixtures()
Пустая фикстура в которую будет вставлены значения из декоратора apply_fixture_db
Source code in fastapi_accelerator/testutils/fixture_db/apply_fixture.py
14 15 16 17 | |
patch_integration(mock_rules)
Декоратор для подмены методов интеграции на mock.
Примечание
Вы можете хранить mock_rules в отдельных переменных и переиспользовать их для разных функций/методов тестирования.
Source code in fastapi_accelerator/testutils/fixture_integration.py
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | |
rm_key_from_deep_dict(data, keys)
Удалить ключи из dict или из списка словарей рекурсивно.
data: Данные для отчистки keys: Ключи которые нужно удалить из данных
Пример:
rm_key_from_deep_dict({"date": "...", "user": "..."}, ["data"])
{"user": "..."}
Source code in fastapi_accelerator/testutils/utils.py
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | |
run_async(async_function)
Синхронная обертка для асинхронного вызова
Source code in fastapi_accelerator/utils.py
56 57 58 | |
track_queries(db_manager, expected_count=None)
Перехват SQL команд, для их анализа
expected_count: Сколько ожидается выполниться SQL команд
Пример использования:
def test_get_list(self, client: TestClient, db_manager: MainDatabaseManager): with track_queries(db_manager, expected_count=2) as tracker: response = client.get(self.url)
print(tracker.queries)
Source code in fastapi_accelerator/testutils/fixture_db/trace_sql.py
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | |
url_path_for()
Функция чтобы получить полный URL путь по названию функции
Пример:
def test_base(client: TestClient, url_path_for: Callable):
response = client.get(url_path_for("ИмяФункции"))
Source code in fastapi_accelerator/testutils/utils.py
58 59 60 61 62 63 64 65 66 67 68 69 | |