Skip to content

Routing

Automatic route generation is the meat and potatoes of CRUDRouter's features. Detail below is how you can prefix, customize, and disable any routes generated by the CRUDRouter.

Default Routes

By default, the CRUDRouter will generate the six routes below for you.

Route Method Description
/ GET Get all the resources
/ POST Create a new resource
/ DELETE Delete all the resources
/{item_id} GET Get an existing resource matching the given item_id
/{item_id} PUT Update an existing resource matching the given item_id
/{item_id} DELETE Delete an existing resource matching the given item_id

Route URLs

Note that the route url is prefixed by the defined prefix.

Example: If the CRUDRouter's prefix is set as potato and I want to update a specific potato the route I want to access is /potato/my_potato_id where my_potato_id is the ID of the potato.

Prefixes

Depending on which CRUDRouter you are using, the CRUDRouter will try to automatically generate a suitable prefix for your model. By default, the MemoryCRUDRouter will use the pydantic model's name as the prefix. However, the SQLAlchemyCRUDRouter will use the model's table name as the prefix.

Custom Prefixes

You are also able to set custom prefixes with the prefix kwarg when creating your CRUDRouter. This can be done like so: router = CRUDRouter(model=mymodel, prefix='carrot')

Custom item_id

If you don't want the default item_id as your path parameter name for the item id you can use set the item_id_parameter_name key when creating a new CRUDRouter. This will change the parameter name in the OpenAPI specification for you.

SQLAlchemyCRUDRouter(
    schema=Potato,
    db_model=PotatoModel,
    db=session,
    prefix="potato",
    item_id_parameter_name="potato_id",
)

Disabling Routes

Routes can be disabled from generating with a key word argument (kwarg) when creating your CRUDRouter. The valid kwargs are shown below.

Argument Default Description
get_all_route True Setting this to false will prevent the get all route from generating
get_one_route True Setting this to false will prevent the get one route from generating
delete_all_route True Setting this to false will prevent the delete all route from generating
delete_one_route True Setting this to false will prevent the delete one route from generating
create_route True Setting this to false will prevent the create route from generating
update_route True Setting this to false will prevent the update route from generating

As an example, the delete all route can be disabled by doing the following:

router = MemoryCRUDRouter(schema=MyModel, delete_all_route=False)

Custom Dependencies

Instead to passing a bool to the arguments listed about, you can also pass a sequence of custom dependencies to be applied to each route. See the docs on dependencies for more details.

Overriding Routes

Should you need to add custom functionality to any of your routes any of the included routers allows you to do so. Should you wish to disable a route from being generated, it can be done here.

Routes in the CRUDRouter can be overridden by using the standard fastapi route decorators. These include:

  • @router.get(path: str, *args, **kwargs)
  • @router.post(path: str, *args, **kwargs)
  • @router.put(path: str, *args, **kwargs)
  • @router.delete(path: str, *args, **kwargs)
  • @router.api_route(path: str, methods: List[str] = ['GET'], *args, **kwargs)

Tip

All of CRUDRouter's are a subclass of fastapi's APIRouter meaning that they can be customized to your heart's content.

Overriding Example

Below is an example where we are overriding the routes /potato/{item_id} and /potato while using the MemoryCRUDRouter.

from pydantic import BaseModel
from fastapi import FastAPI
from fastapi_crudrouter import MemoryCRUDRouter as CRUDRouter

class Potato(BaseModel):
    id: int
    color: str
    mass: float

app = FastAPI()
router = CRUDRouter(schema=Potato)

@router.get('')
def overloaded_get_all():
    return 'My overloaded route that returns all the items'

@router.get('/{item_id}')
def overloaded_get_one():
    return 'My overloaded route that returns one item'

app.include_router(router)