Package: fastapi-uuidbase62
fastapi-uuidbase62fastapi-uuidbase62is intended to provide Pydantic and FastAPI functionality that exposes UUID values as
nicely-formatted Stripe-like string values, with validated prefixing. For example, a User UUID identifier of"f8711c37-c1d1-4961-ba3c-98cdc5b4fda8"with a"user"prefix becomes"user_7yNMTpVy8ddRxYKGJqtk7e".BenefitsWhy take this approach?users: easy text selection of Stripe-like formatted values (fast double-click or keyboard-based) compared to UUIDs (
try double clicking the samples above!)database: using UUIDs in your database is likely much more efficient storage-wise as well as more performantprefixing:allows for programmatic routing within a microservice architectureeasier to reason about debug output, logging messages (lower cognitive load/overhead)Installationfastapi-uuidbase62installation is much the same as any other Python package.pip install fastapi-uuidbase62Python SupportPython 3.7, 3.8, 3.9, 3.10, 3.11 are supported and covered by thetoxtest configuration described below.UsageThis package provides the ability to define a field on a Pydantic model that auto-serializes a UUID value to
base62 and auto-prefixes a defined label. This serializes a UUID to a prefixed string when rendering a FastAPI
response, and does the reverse when processing an incoming FastAPI request.In the following example, take note of the following:UUIDBase62ModelMixinadds ato_uuidbase62method to Model to easily convert a UUID or valid base62 prefixed value to aUUIDBase62valuethecon_uuidbase62function, which defines the autoprefixing and serializing UUID <-> str fieldtheget_validated_uuidbase62_by_modeldependency injection function providing validation/serialization on incoming base62-encoded parameters (path, header, query)there is a similarget_validated_uuidbase62function that does not rely on a Model class/fieldUUIDBase62instance propertiesuuidbase62_value.uuid: UUID matching the base62 encoded struuidbase62_value.base62_str: non-prefixed base62 string valueuuidbase62_value.value: prefixed base62 string value, same asstr(uuidbase62_value)uuidbase62_value.prefix: the prefix used for thisUUIDBase62instanceimportuuidfromfastapiimportFastAPI,DependsfrompydanticimportBaseModelfromuuidbase62importcon_uuidbase62,UUIDBase62,UUIDBase62ModelMixin,get_validated_uuidbase62_by_modelapp=FastAPI()classBook(UUIDBase62ModelMixin,BaseModel):id:con_uuidbase62(prefix="book")title:str@app.get("/",response_model=list[Book])asyncdefget_item_list():# fake fetching a list of books from the DB, yielding book IDs and titlesreturn[{"id":uuid.uuid4(),"title":"Red Mars",}]@app.get("/{item_id}",response_model=Book)asyncdefget_item(item_id:UUIDBase62=Depends(get_validated_uuidbase62_by_model(Book,'id','item_id'))):# fake fetching from the DB based on `item_id`, yielding a book ID and titlereturn{"id":uuid.uuid4(),"title":"Green Mars",}@app.post("/",response_model=Book)asyncdefcreate_item(item:Book):book_id=item.id# UUIDBase62 valuebook_id.uuid# uuid valuebook_id.base62_str# non-prefixed base62 string valuebook_id.value# prefixed base62 string value, same as str(book_id)book_id.prefix# 'book'returnitem.dict()DevelopmentTo set up a development environment, it is recommended to create a Python virtual environment, and then install
development requirements. You should probably be usingpyenvto manage your local Python versions:# do this for each supported Python version, all are needed to run complete tests via tox
pyenv install 3.x.x 

# in the project directory, make supported Python versions available; first one listed is the default Python
pyenv local 3.10.x 3.7.x 3.8.x 3.9.x 3.11.x 

# create Python virtual environment
python -m venv venv

# install development dependencies
./venv/bin/pip install -r requirements.txtTestingfastapi-uuidbase62is easily tested via theconfiguration set up withtox, which configures thetoxcommand line tool:# run tox, parallel mode
./venv/bin/tox -pContributingLeverageGithub issues, and do consider submitting fixes/improvements via pull requests on Github.