[Issue #1312]: full examples use lifespan instead of on_startup (#1363)

* docs(examples): full examples use lifespan instead of on_startup for database initialization

* Update beanie.md

Replaced the annotations on the notes that I missed
This commit is contained in:
Brandon H. Goding
2024-03-05 03:09:49 -05:00
committed by GitHub
parent 0df82afb32
commit 2ffb7006ff
5 changed files with 60 additions and 39 deletions

View File

@ -40,20 +40,24 @@ Notice that we pass a reference to the `User` model we defined above.
## Initialize Beanie ## Initialize Beanie
When initializing your FastAPI app, it's important that you [**initialize Beanie**](https://roman-right.github.io/beanie/tutorial/initialization/) so it can discover your models. We can achieve this using a startup event handler on the FastAPI app: When initializing your FastAPI app, it's important that you [**initialize Beanie**](https://roman-right.github.io/beanie/tutorial/initialization/) so it can discover your models. We can achieve this using [**Lifespan Events**](https://fastapi.tiangolo.com/advanced/events/) on the FastAPI app:
```py ```py
from contextlib import asynccontextmanager
from beanie import init_beanie from beanie import init_beanie
@app.on_event("startup") @asynccontextmanager
async def on_startup(): async def lifespan(app: FastAPI):
await init_beanie( await init_beanie(
database=db, # (1)! database=db, # (1)!
document_models=[ document_models=[
User, # (2)! User, # (2)!
], ],
) )
yield
app = FastAPI(lifespan=lifespan)
``` ```
1. This is the `db` Motor database instance we defined above. 1. This is the `db` Motor database instance we defined above.

View File

@ -1,3 +1,5 @@
from contextlib import asynccontextmanager
from beanie import init_beanie from beanie import init_beanie
from fastapi import Depends, FastAPI from fastapi import Depends, FastAPI
@ -11,7 +13,19 @@ from app.users import (
google_oauth_client, google_oauth_client,
) )
app = FastAPI()
@asynccontextmanager
async def lifespan(app: FastAPI):
await init_beanie(
database=db,
document_models=[
User,
],
)
yield
app = FastAPI(lifespan=lifespan)
app.include_router( app.include_router(
fastapi_users.get_auth_router(auth_backend), prefix="/auth/jwt", tags=["auth"] fastapi_users.get_auth_router(auth_backend), prefix="/auth/jwt", tags=["auth"]
@ -46,13 +60,3 @@ app.include_router(
@app.get("/authenticated-route") @app.get("/authenticated-route")
async def authenticated_route(user: User = Depends(current_active_user)): async def authenticated_route(user: User = Depends(current_active_user)):
return {"message": f"Hello {user.email}!"} return {"message": f"Hello {user.email}!"}
@app.on_event("startup")
async def on_startup():
await init_beanie(
database=db,
document_models=[
User,
],
)

View File

@ -1,3 +1,5 @@
from contextlib import asynccontextmanager
from beanie import init_beanie from beanie import init_beanie
from fastapi import Depends, FastAPI from fastapi import Depends, FastAPI
@ -5,7 +7,20 @@ from app.db import User, db
from app.schemas import UserCreate, UserRead, UserUpdate from app.schemas import UserCreate, UserRead, UserUpdate
from app.users import auth_backend, current_active_user, fastapi_users from app.users import auth_backend, current_active_user, fastapi_users
app = FastAPI()
@asynccontextmanager
async def lifespan(app: FastAPI):
await init_beanie(
database=db,
document_models=[
User,
],
)
yield
app = FastAPI(lifespan=lifespan)
app.include_router( app.include_router(
fastapi_users.get_auth_router(auth_backend), prefix="/auth/jwt", tags=["auth"] fastapi_users.get_auth_router(auth_backend), prefix="/auth/jwt", tags=["auth"]
@ -35,13 +50,3 @@ app.include_router(
@app.get("/authenticated-route") @app.get("/authenticated-route")
async def authenticated_route(user: User = Depends(current_active_user)): async def authenticated_route(user: User = Depends(current_active_user)):
return {"message": f"Hello {user.email}!"} return {"message": f"Hello {user.email}!"}
@app.on_event("startup")
async def on_startup():
await init_beanie(
database=db,
document_models=[
User,
],
)

View File

@ -1,3 +1,5 @@
from contextlib import asynccontextmanager
from fastapi import Depends, FastAPI from fastapi import Depends, FastAPI
from app.db import User, create_db_and_tables from app.db import User, create_db_and_tables
@ -10,7 +12,15 @@ from app.users import (
google_oauth_client, google_oauth_client,
) )
app = FastAPI()
@asynccontextmanager
async def lifespan(app: FastAPI):
# Not needed if you setup a migration system like Alembic
await create_db_and_tables()
yield
app = FastAPI(lifespan=lifespan)
app.include_router( app.include_router(
fastapi_users.get_auth_router(auth_backend), prefix="/auth/jwt", tags=["auth"] fastapi_users.get_auth_router(auth_backend), prefix="/auth/jwt", tags=["auth"]
@ -45,9 +55,3 @@ app.include_router(
@app.get("/authenticated-route") @app.get("/authenticated-route")
async def authenticated_route(user: User = Depends(current_active_user)): async def authenticated_route(user: User = Depends(current_active_user)):
return {"message": f"Hello {user.email}!"} return {"message": f"Hello {user.email}!"}
@app.on_event("startup")
async def on_startup():
# Not needed if you setup a migration system like Alembic
await create_db_and_tables()

View File

@ -1,10 +1,20 @@
from contextlib import asynccontextmanager
from fastapi import Depends, FastAPI from fastapi import Depends, FastAPI
from app.db import User, create_db_and_tables from app.db import User, create_db_and_tables
from app.schemas import UserCreate, UserRead, UserUpdate from app.schemas import UserCreate, UserRead, UserUpdate
from app.users import auth_backend, current_active_user, fastapi_users from app.users import auth_backend, current_active_user, fastapi_users
app = FastAPI()
@asynccontextmanager
async def lifespan(app: FastAPI):
# Not needed if you setup a migration system like Alembic
await create_db_and_tables()
yield
app = FastAPI(lifespan=lifespan)
app.include_router( app.include_router(
fastapi_users.get_auth_router(auth_backend), prefix="/auth/jwt", tags=["auth"] fastapi_users.get_auth_router(auth_backend), prefix="/auth/jwt", tags=["auth"]
@ -34,9 +44,3 @@ app.include_router(
@app.get("/authenticated-route") @app.get("/authenticated-route")
async def authenticated_route(user: User = Depends(current_active_user)): async def authenticated_route(user: User = Depends(current_active_user)):
return {"message": f"Hello {user.email}!"} return {"message": f"Hello {user.email}!"}
@app.on_event("startup")
async def on_startup():
# Not needed if you setup a migration system like Alembic
await create_db_and_tables()