Bird
Raised Fist0
FastAPIframework~20 mins

Async generator dependencies in FastAPI - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Async Dependency Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What is the output of this FastAPI async dependency?
Consider this FastAPI async generator dependency. What will the endpoint return when called?
FastAPI
from fastapi import FastAPI, Depends

app = FastAPI()

async def async_dep():
    yield "hello"

@app.get("/test")
async def test(dep: str = Depends(async_dep)):
    return {"message": dep}
A{"message": null}
B{"message": "hello"}
CTypeError: 'async_generator' object is not subscriptable
D500 Internal Server Error
Attempts:
2 left
💡 Hint
Remember that async generator dependencies yield values that are passed to the endpoint parameter.
❓ lifecycle
intermediate
2:00remaining
When is the cleanup code in an async generator dependency executed?
Given this async generator dependency, when will the cleanup code after the yield run?
FastAPI
from fastapi import FastAPI, Depends

app = FastAPI()

async def resource_dep():
    print("Setup resource")
    yield "resource"
    print("Cleanup resource")

@app.get("/use")
async def use_resource(res: str = Depends(resource_dep)):
    return {"used": res}
AOnly if the endpoint raises an exception
BBefore the endpoint function starts executing
CNever, the cleanup code is ignored
DImmediately after the endpoint function finishes executing
Attempts:
2 left
💡 Hint
Think about how async generators work with yield and what happens after yield.
📝 Syntax
advanced
2:00remaining
Which option correctly defines an async generator dependency in FastAPI?
Select the option that correctly defines an async generator dependency that yields a database session.
A
async def get_db():
    db = Session()
    return db
    db.close()
B
def get_db():
    db = Session()
    yield db
    db.close()
C
async def get_db():
    db = Session()
    yield db
    db.close()
D
async def get_db():
    db = Session()
    yield db
    await db.close()
Attempts:
2 left
💡 Hint
Async generator dependencies must use yield and can have cleanup code after yield.
🔧 Debug
advanced
2:00remaining
Why does this async generator dependency cause a runtime error?
Examine the code and select the reason for the runtime error when calling the endpoint.
FastAPI
from fastapi import FastAPI, Depends

app = FastAPI()

async def broken_dep():
    resource = open("file.txt")
    yield resource
    resource.close()

@app.get("/read")
async def read_file(f = Depends(broken_dep)):
    return {"content": f.read()}
AUsing a synchronous file object in an async dependency causes blocking and runtime error
BThe file is closed before reading, causing a ValueError
CThe dependency must be a normal function, not async
DMissing await before resource.read() causes a TypeError
Attempts:
2 left
💡 Hint
Think about mixing synchronous blocking calls inside async functions.
🧠 Conceptual
expert
3:00remaining
What happens if an async generator dependency raises an exception after yield?
In FastAPI, if an async generator dependency yields a value but then raises an exception during cleanup code after yield, what is the effect on the endpoint response?
AThe endpoint response is replaced by a 500 Internal Server Error due to the exception
BThe endpoint response is sent normally, but the exception is logged and does not affect the response
CThe exception is silently ignored and no logs are produced
DThe endpoint never completes and hangs indefinitely
Attempts:
2 left
💡 Hint
Consider how FastAPI handles exceptions in dependency cleanup after the endpoint returns.

Practice

(1/5)
1. What is the main purpose of using an async generator dependency in FastAPI?
easy
A. To manage setup and cleanup actions around a request automatically
B. To speed up synchronous code execution
C. To replace all regular functions with asynchronous ones
D. To create infinite loops inside API endpoints

Solution

  1. Step 1: Understand async generator dependencies

    Async generator dependencies use async def with yield to run setup code before yielding and cleanup code after.
  2. Step 2: Identify their purpose in FastAPI

    This pattern is mainly used to manage resources safely, like opening and closing database connections around a request.
  3. Final Answer:

    To manage setup and cleanup actions around a request automatically -> Option A
  4. Quick Check:

    Async generator dependencies = setup + cleanup [OK]
Hint: Think setup before yield, cleanup after yield [OK]
Common Mistakes:
  • Confusing async generators with normal async functions
  • Thinking they speed up synchronous code
  • Assuming they replace all functions
2. Which of the following is the correct syntax to define an async generator dependency in FastAPI?
easy
A. async def resource(): yield 'data'
B. def resource(): yield 'data'
C. async def resource(): return 'data'
D. def resource(): return 'data'

Solution

  1. Step 1: Identify async generator syntax

    An async generator uses async def and yield inside the function body.
  2. Step 2: Compare options

    async def resource(): yield 'data' uses async def and yield, which is correct. Options A and B are synchronous, and C uses return instead of yield.
  3. Final Answer:

    async def resource(): yield 'data' -> Option A
  4. Quick Check:

    Async + yield = async generator [OK]
Hint: Async generator = async def + yield inside [OK]
Common Mistakes:
  • Using return instead of yield
  • Forgetting async keyword
  • Using synchronous def for async generator
3. Given this FastAPI async generator dependency, what will be printed when the endpoint is called?
async def resource():
    print('Setup')
    yield 'data'
    print('Cleanup')

@app.get('/')
async def read(resource=Depends(resource)):
    print('Inside endpoint')
    return resource
medium
A. Inside endpoint only
B. Inside endpoint, Setup, Cleanup
C. Setup, Cleanup, Inside endpoint
D. Setup, Inside endpoint, Cleanup

Solution

  1. Step 1: Understand async generator flow

    When the endpoint is called, FastAPI runs the async generator up to the yield (prints 'Setup'), then runs the endpoint code (prints 'Inside endpoint'), then after response finishes, runs code after yield (prints 'Cleanup').
  2. Step 2: Order of prints

    The prints happen in order: 'Setup', 'Inside endpoint', 'Cleanup'.
  3. Final Answer:

    Setup, Inside endpoint, Cleanup -> Option D
  4. Quick Check:

    Yield pauses, so Setup before, Cleanup after endpoint [OK]
Hint: Setup prints before yield, cleanup after endpoint runs [OK]
Common Mistakes:
  • Assuming cleanup runs before endpoint
  • Thinking yield returns immediately
  • Ignoring async generator lifecycle
4. Identify the error in this async generator dependency code:
async def resource():
    connection = await connect_db()
    yield connection
    await connection.close()

@app.get('/')
async def read(conn=Depends(resource)):
    return {'status': 'ok'}
medium
A. Missing await before yield
B. Cannot yield inside async def
C. Not using try-finally to ensure cleanup
D. Depends should not be used with async generators

Solution

  1. Step 1: Check resource cleanup safety

    Without try-finally, if an exception occurs, await connection.close() might not run, causing resource leaks.
  2. Step 2: Proper pattern for async generator cleanup

    Use try-finally around yield to guarantee cleanup runs even on errors.
  3. Final Answer:

    Not using try-finally to ensure cleanup -> Option C
  4. Quick Check:

    Always use try-finally for cleanup in async generators [OK]
Hint: Use try-finally to guarantee cleanup after yield [OK]
Common Mistakes:
  • Forgetting try-finally causes resource leaks
  • Thinking yield needs await
  • Believing Depends can't use async generators
5. You want to create an async generator dependency that opens a database connection, yields it, and ensures it closes even if the endpoint raises an error. Which code snippet correctly implements this?
hard
A. async def db(): conn = await open_db() yield conn await conn.close()
B. async def db(): conn = await open_db() try: yield conn finally: await conn.close()
C. async def db(): conn = await open_db() yield conn conn.close()
D. async def db(): conn = open_db() yield conn await conn.close()

Solution

  1. Step 1: Ensure proper async resource management

    Opening the connection must be awaited, and closing must happen even if errors occur.
  2. Step 2: Use try-finally around yield

    Only async def db(): conn = await open_db() try: yield conn finally: await conn.close() uses try-finally to guarantee await conn.close() runs after yield, even on exceptions.
  3. Final Answer:

    async def db(): conn = await open_db() try: yield conn finally: await conn.close() -> Option B
  4. Quick Check:

    Try-finally ensures cleanup after yield [OK]
Hint: Wrap yield in try-finally to always close resources [OK]
Common Mistakes:
  • Not awaiting open_db()
  • Not using try-finally for cleanup
  • Calling close() without await
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard