backend utils
Project description
backend-utils
Useful python tools for backend services
Documentation
Tools
Singleton- metaclass to make singletons
from backend_utils.tools import Singleton
class A(metaclass=Singleton):
pass
print(id(A()) == id(A())) # True
StrEnum- subclasses that create variants usingauto()will have values equal to their names
from enum import auto
from backend_utils.tools import StrEnum
class Bit(StrEnum):
one = auto()
two = auto()
print(Bit.one.value) # 'one'
print(Bit.two.value) # 'two'
Server
Router,compile_routers,register_routers- build routers for fastapi app
from fastapi import FastAPI, APIRouter
from backend_utils.server import (
Router, compile_routers, register_routers
)
router = APIRouter()
routers = [
Router(router=router, tags=['Users'], prefix='/users'),
]
compiled_routers = compile_routers(
routers=routers,
root_prefix='/api/v1'
)
app = FastAPI()
register_routers(
app=app,
routers=[*compiled_routers]
)
This code will compile routers:
/api/v1/users/*
Http
-
RequestMethods- enum for http methods -
BaseRequester- base class for http clients. You can specifyURL,TIMEOUT,MIDDLEWARE. Useself.make_request()to make http requests
import os
import asyncio
from typing import Optional
import httpx
from backend_utils.http import BaseRequester, RequestMethods
class JsonPlaceholder(BaseRequester):
URL = os.getenv('JSONPLACEHOLDER_URL', 'https://jsonplaceholder.typicode.com')
TIMEOUT = 10
async def get_todo(self, todo_id: int) -> Optional[httpx.Response]:
return await self.make_request(
method=RequestMethods.GET,
uri=f'/todos/{todo_id}',
)
if __name__ == '__main__':
jp = JsonPlaceholder()
asyncio.run(jp.get_todo(todo_id=1))
You also can validate response with pydantic models
import os
import asyncio
from typing import Optional
from pydantic import BaseModel, Field
from backend_utils.http import BaseRequester, RequestMethods
class GetTodo(BaseModel):
user_id: int = Field(..., alias='userId')
id: int
title: str
completed: bool
class JsonPlaceholder(BaseRequester):
async def get_todo_model(self, todo_id: int) -> Optional[GetTodo]:
url = os.getenv('JSONPLACEHOLDER_URL', 'https://jsonplaceholder.typicode.com')
return await self.make_request(
method=RequestMethods.GET,
url=f'{url}/todos/{todo_id}',
response_model=GetTodo,
timeout=5.5
)
if __name__ == '__main__':
jp = JsonPlaceholder()
asyncio.run(jp.get_todo_model(todo_id=1))
So it will return GetTodo model or None if request failed
BaseMiddleware- base class for http request middleware. Available methods:before_request(self, request: httpx.Request)after_request(self, request: httpx.Request, response: httpx.Response):on_request_error(self, request: httpx.Request, error: httpx.HTTPError)on_request_status_error(self, request: httpx.Request)on_validation_error(self, response: httpx.Response, error: [ValidationError, json.decoder.JSONDecodeError])
For example middleware to print request time
import os
import time
import asyncio
from typing import Optional
import httpx
from backend_utils.http import BaseRequester, RequestMethods, BaseMiddleware
class PrintRequestTime(BaseMiddleware):
async def before_request(self, request: httpx.Request):
request.start_time = time.perf_counter()
async def after_request(self, request: httpx.Request, response: httpx.Response):
request_time = time.perf_counter() - request.start_time
print(request_time)
class JsonPlaceholder(BaseRequester):
URL = os.getenv('JSONPLACEHOLDER_URL', 'https://jsonplaceholder.typicode.com')
MIDDLEWARES = [PrintRequestTime()]
async def get_todo(self, todo_id: int) -> Optional[httpx.Response]:
return await self.make_request(
method=RequestMethods.GET,
uri=f'/todos/{todo_id}',
)
if __name__ == '__main__':
jp = JsonPlaceholder()
asyncio.run(jp.get_todo(todo_id=1))
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file backend-utils-0.2.0.tar.gz.
File metadata
- Download URL: backend-utils-0.2.0.tar.gz
- Upload date:
- Size: 6.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.13 CPython/3.10.2 Linux/5.13.0-1021-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
973c9cb19c34e40d1dedc9657c992a53fcb8b72e6079790f1075f1e6a77f1441
|
|
| MD5 |
690448eb7f2e46f7c4bbd0f1012a48ee
|
|
| BLAKE2b-256 |
e4b18487208a1e2b4b56aebf674706dcdbdb0bb6c888d1408e5ff36db0f67bb6
|
File details
Details for the file backend_utils-0.2.0-py3-none-any.whl.
File metadata
- Download URL: backend_utils-0.2.0-py3-none-any.whl
- Upload date:
- Size: 6.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.13 CPython/3.10.2 Linux/5.13.0-1021-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b0959be5a938e4a60c135f80e9f11386d54f71b3952604593a8184b60c7823b1
|
|
| MD5 |
b64b1492459fb636591e50e482558099
|
|
| BLAKE2b-256 |
ef10f33bfdebf48fca5c12578b7a486bdd70686ba75baa42966f20341f00acf8
|