Skip to content

Beanie

FastAPI Users provides the necessary tools to work with MongoDB databases using the Beanie ODM.

Setup database connection and collection

The first thing to do is to create a MongoDB connection using mongodb/motor (automatically installed with Beanie).

import motor.motor_asyncio
from beanie import Document
from fastapi_users.db import BeanieBaseUser, BeanieUserDatabase

DATABASE_URL = "mongodb://localhost:27017"
client = motor.motor_asyncio.AsyncIOMotorClient(
    DATABASE_URL, uuidRepresentation="standard"
)
db = client["database_name"]


class User(BeanieBaseUser, Document):
    pass


async def get_user_db():
    yield BeanieUserDatabase(User)

You can choose any name for the database.

Create the User model

As for any Beanie ODM model, we'll create a User model.

import motor.motor_asyncio
from beanie import Document
from fastapi_users.db import BeanieBaseUser, BeanieUserDatabase

DATABASE_URL = "mongodb://localhost:27017"
client = motor.motor_asyncio.AsyncIOMotorClient(
    DATABASE_URL, uuidRepresentation="standard"
)
db = client["database_name"]


class User(BeanieBaseUser, Document):
    pass


async def get_user_db():
    yield BeanieUserDatabase(User)

As you can see, FastAPI Users provides a base class that will include base fields for our User table. You can of course add you own fields there to fit to your needs!

Info

The base class is configured to automatically create a unique index on id and email.

Info

If you want to add your own custom settings to your User document model - like changing the collection name - don't forget to let your inner Settings class inherit the pre-defined settings from BeanieBaseUser like this: class Settings(BeanieBaseUser.Settings): # ...! See Beanie's documentation on Settings for details.

Create the database adapter

The database adapter of FastAPI Users makes the link between your database configuration and the users logic. It should be generated by a FastAPI dependency.

import motor.motor_asyncio
from beanie import Document
from fastapi_users.db import BeanieBaseUser, BeanieUserDatabase

DATABASE_URL = "mongodb://localhost:27017"
client = motor.motor_asyncio.AsyncIOMotorClient(
    DATABASE_URL, uuidRepresentation="standard"
)
db = client["database_name"]


class User(BeanieBaseUser, Document):
    pass


async def get_user_db():
    yield BeanieUserDatabase(User)

Notice that we pass a reference to the User model we defined above.

Initialize Beanie

When initializing your FastAPI app, it's important that you initialize Beanie so it can discover your models. We can achieve this using Lifespan Events on the FastAPI app:

from contextlib import asynccontextmanager
from beanie import init_beanie


@asynccontextmanager
async def lifespan(app: FastAPI):
    await init_beanie(
        database=db,  # (1)!
        document_models=[
            User,  # (2)!
        ],
    )
    yield

app = FastAPI(lifespan=lifespan)
  1. This is the db Motor database instance we defined above.

  2. This is the Beanie User model we defined above. Don't forget to also add your very own models!