Bird
Raised Fist0
FastAPIframework~5 mins

Lifespan context manager in FastAPI - Cheat Sheet & Quick Revision

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Recall & Review
beginner
What is the purpose of the lifespan context manager in FastAPI?
It manages startup and shutdown events for the application, allowing you to run code before the app starts and after it stops.
Click to reveal answer
intermediate
How do you define a lifespan context manager in FastAPI?
By creating an async generator function that yields control once startup tasks are done, then runs shutdown tasks after the yield.
Click to reveal answer
beginner
Which FastAPI parameter accepts the lifespan context manager?
The 'lifespan' parameter in the FastAPI constructor accepts the lifespan context manager function.
Click to reveal answer
intermediate
What happens if you don't use a lifespan context manager in FastAPI?
You cannot run custom startup or shutdown code automatically; you would need to use event decorators or miss lifecycle control.
Click to reveal answer
beginner
Show a simple example of a lifespan context manager in FastAPI.
from fastapi import FastAPI
from contextlib import asynccontextmanager

@asynccontextmanager
async def lifespan(app):
    print('Starting up')
    yield
    print('Shutting down')

app = FastAPI(lifespan=lifespan)
Click to reveal answer
What type of function is used to create a lifespan context manager in FastAPI?
AA regular synchronous function
BAn async generator function
CA class constructor
DA lambda function
Where do you pass the lifespan context manager in FastAPI?
AAs the 'lifespan' argument in FastAPI()
BInside a route decorator
CIn the middleware configuration
DIn the database connection setup
What does the yield statement do inside the lifespan context manager?
AStarts the server
BEnds the function immediately
CPauses startup and waits for shutdown
DRuns the main application code
Which of these is NOT a benefit of using a lifespan context manager?
AFaster HTTP response times
BCentralized startup and shutdown logic
CAutomatic resource cleanup
DCleaner code organization
If you want to connect to a database on startup and disconnect on shutdown, where should you put this code?
AIn the main.py global scope
BInside a route handler
CIn the HTML templates
DInside the lifespan context manager
Explain how the lifespan context manager controls startup and shutdown in FastAPI.
Think about what happens before and after the yield in the async function.
You got /5 concepts.
    Describe a real-life scenario where using a lifespan context manager in FastAPI is helpful.
    Imagine preparing and cleaning up before and after a big event.
    You got /5 concepts.

      Practice

      (1/5)
      1. What is the main purpose of the lifespan context manager in a FastAPI application?
      easy
      A. To manage user authentication and authorization
      B. To handle HTTP requests and responses
      C. To define API routes and endpoints
      D. To run setup code when the app starts and cleanup code when it stops

      Solution

      1. Step 1: Understand the role of lifespan context manager

        The lifespan context manager is designed to run code at the start and end of the FastAPI app lifecycle.
      2. Step 2: Identify its main use

        It is used to set up resources like database connections when the app starts and clean them up when the app stops.
      3. Final Answer:

        To run setup code when the app starts and cleanup code when it stops -> Option D
      4. Quick Check:

        Lifespan manages startup and shutdown code = A [OK]
      Hint: Lifespan runs code at app start and stop [OK]
      Common Mistakes:
      • Confusing lifespan with route handling
      • Thinking lifespan manages HTTP requests
      • Assuming lifespan handles user sessions
      2. Which of the following is the correct way to define a lifespan context manager in FastAPI?
      easy
      A. async def lifespan(app): yield
      B. def lifespan(): return app
      C. async def lifespan(): return app
      D. def lifespan(app): yield

      Solution

      1. Step 1: Recall lifespan signature

        The lifespan function must be async and accept the app parameter to manage startup and shutdown.
      2. Step 2: Confirm use of yield

        Using yield inside the async function allows running code before and after the yield for startup and shutdown.
      3. Final Answer:

        async def lifespan(app): yield -> Option A
      4. Quick Check:

        Async + app param + yield = A [OK]
      Hint: Lifespan is async with app param and uses yield [OK]
      Common Mistakes:
      • Forgetting async keyword
      • Missing app parameter
      • Using return instead of yield
      3. Given this FastAPI lifespan code snippet, what will be printed when the app starts and stops?
      async def lifespan(app):
          print('Starting app')
          yield
          print('Stopping app')
      medium
      A. Only 'Starting app' is printed
      B. 'Starting app' prints on start, 'Stopping app' prints on shutdown
      C. Only 'Stopping app' is printed
      D. Neither message is printed

      Solution

      1. Step 1: Understand yield in lifespan

        The code before yield runs at startup, and code after yield runs at shutdown.
      2. Step 2: Match prints to lifecycle events

        So 'Starting app' prints when app starts, and 'Stopping app' prints when app stops.
      3. Final Answer:

        'Starting app' prints on start, 'Stopping app' prints on shutdown -> Option B
      4. Quick Check:

        Code before yield = start, after yield = stop [OK]
      Hint: Code before yield runs on start, after yield on stop [OK]
      Common Mistakes:
      • Thinking both prints run immediately
      • Assuming yield blocks all prints
      • Confusing start and stop timing
      4. What is wrong with this lifespan context manager code?
      async def lifespan(app):
          print('Starting')
          return
          print('Stopping')
      medium
      A. The app parameter is not used, causing runtime error
      B. Missing async keyword causes syntax error
      C. Using return instead of yield prevents shutdown code from running
      D. Print statements are not allowed in lifespan functions

      Solution

      1. Step 1: Identify use of return instead of yield

        The lifespan function must use yield to separate startup and shutdown code.
      2. Step 2: Understand effect of return

        Using return exits the function immediately, so shutdown code after it never runs.
      3. Final Answer:

        Using return instead of yield prevents shutdown code from running -> Option C
      4. Quick Check:

        Return exits early; yield separates start/stop [OK]
      Hint: Use yield, not return, to run shutdown code [OK]
      Common Mistakes:
      • Confusing return and yield in async functions
      • Ignoring that shutdown code runs after yield
      • Assuming print statements cause errors
      5. You want to open a database connection when your FastAPI app starts and close it when the app stops using the lifespan context manager. Which code correctly implements this?
      hard
      A. async def lifespan(app): db = await connect_db() app.state.db = db yield await db.close()
      B. async def lifespan(app): db = await connect_db() yield app.state.db = db await db.close()
      C. def lifespan(app): db = connect_db() app.state.db = db yield db.close()
      D. async def lifespan(): db = await connect_db() app.state.db = db yield await db.close()

      Solution

      1. Step 1: Confirm async function with app parameter

        The lifespan function must be async and accept the app parameter to store the db connection.
      2. Step 2: Check order of operations

        Connect to the database before yield, store it on app.state, then close it after yield.
      3. Step 3: Verify correct use of await and yield

        Await connect_db and db.close, yield separates startup and shutdown code.
      4. Final Answer:

        async def lifespan(app): db = await connect_db() app.state.db = db yield await db.close() -> Option A
      5. Quick Check:

        Async + app param + yield + await connect/close = D [OK]
      Hint: Connect before yield, close after, store in app.state [OK]
      Common Mistakes:
      • Placing yield before storing db connection
      • Missing async or await keywords
      • Not passing app parameter to lifespan