Skip to main content

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 using auto() 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 specify URL, TIMEOUT, MIDDLEWARE. Use self.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))

Metadata

Release files for backend-utils 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for backend-utils 0.2.0
File Size Uploaded
backend-utils-0.2.0.tar.gz 6.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for backend-utils 0.2.0
File Interpreter ABI Platform
backend_utils-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 12.9 kB

Release files / backend-utils-0.2.0.tar.gz

Download URL backend-utils-0.2.0.tar.gz
Size 6.1 kB
Tags Source
SHA-256 checksum
How to use checksums
973c9cb19c34e40d1dedc9657c992a53fcb8b72e6079790f1075f1e6a77f1441
BLAKE2b-256 checksum
How to use checksums
e4b18487208a1e2b4b56aebf674706dcdbdb0bb6c888d1408e5ff36db0f67bb6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.1.13 CPython/3.10.2 Linux/5.13.0-1021-azure

Release files / backend_utils-0.2.0-py3-none-any.whl

Download URL backend_utils-0.2.0-py3-none-any.whl
Size 6.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b0959be5a938e4a60c135f80e9f11386d54f71b3952604593a8184b60c7823b1
BLAKE2b-256 checksum
How to use checksums
ef10f33bfdebf48fca5c12578b7a486bdd70686ba75baa42966f20341f00acf8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.1.13 CPython/3.10.2 Linux/5.13.0-1021-azure

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page