Bird
Raised Fist0
FastAPIframework~20 mins

APIRouter for modular routes in FastAPI - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
APIRouter Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What is the output when accessing the '/items/42' route?

Given the following FastAPI app with APIRouter, what will be the JSON response when a client requests /items/42?

FastAPI
from fastapi import FastAPI, APIRouter

router = APIRouter()

@router.get('/{item_id}')
async def read_item(item_id: int):
    return {"item_id": item_id, "name": f"Item {item_id}"}

app = FastAPI()
app.include_router(router, prefix='/items')
A404 Not Found
B{"item_id": "42", "name": "Item 42"}
C{"item_id": 42}
D{"item_id": 42, "name": "Item 42"}
Attempts:
2 left
💡 Hint

Check how the item_id parameter is typed and how the router prefix affects the route.

📝 Syntax
intermediate
1:30remaining
Which option correctly registers a router with prefix '/users'?

Choose the correct way to include an APIRouter named user_router into a FastAPI app with the prefix /users.

FastAPI
from fastapi import FastAPI, APIRouter

user_router = APIRouter()

app = FastAPI()
Aapp.include_router(user_router, path='/users')
Bapp.include_router(user_router, prefix='/users')
Capp.include_router('/users', user_router)
Dapp.add_router(user_router, prefix='/users')
Attempts:
2 left
💡 Hint

Check the method name and parameter names for including routers.

🔧 Debug
advanced
2:30remaining
Why does this route never get called?

Consider this FastAPI app code:

from fastapi import FastAPI, APIRouter

router = APIRouter()

@router.get('/profile')
async def get_profile():
    return {"profile": "user"}

app = FastAPI()
app.include_router(router, prefix='/user')

@app.get('/user/profile')
async def direct_profile():
    return {"profile": "direct"}

When a client requests /user/profile, which response is returned and why?

A{"profile": "user"} because the router route matches first
B500 Internal Server Error due to duplicate routes
C404 Not Found because of route conflict
D{"profile": "direct"} because the app route overrides the router
Attempts:
2 left
💡 Hint

Consider the order of route registration and how FastAPI resolves routes: routes are matched in the order they are registered (first registered matches first).

❓ state_output
advanced
2:00remaining
What is the output of this modular route setup?

Given these two router modules and main app, what JSON is returned when requesting /api/v1/products/5?

# products_router.py
from fastapi import APIRouter

router = APIRouter()

@router.get('/products/{product_id}')
async def get_product(product_id: int):
    return {"product_id": product_id, "status": "ok"}

# main.py
from fastapi import FastAPI
from products_router import router as products_router

app = FastAPI()
app.include_router(products_router, prefix='/api/v1')
A404 Not Found
B{"product_id": "5", "status": "ok"}
C{"product_id": 5, "status": "ok"}
D{"status": "ok"}
Attempts:
2 left
💡 Hint

Check how the prefix affects the full route path and the parameter type.

🧠 Conceptual
expert
3:00remaining
Which statement about APIRouter usage is TRUE?

Choose the correct statement about using APIRouter in FastAPI for modular route design.

AAPIRouter allows grouping routes and can be included multiple times with different prefixes in the same app.
BAPIRouter routes must be unique across the entire app and cannot share path names even with different prefixes.
CIncluding an APIRouter with a prefix automatically merges all route parameters into the app's global parameters.
DAPIRouter cannot be used to define routes with dependencies; dependencies must be defined only in the main app.
Attempts:
2 left
💡 Hint

Think about modular design and route reuse with different prefixes.

Practice

(1/5)
1. What is the main purpose of using APIRouter in a FastAPI application?
easy
A. To replace the main FastAPI app instance
B. To handle background tasks
C. To automatically generate database models
D. To organize routes into smaller, manageable groups

Solution

  1. Step 1: Understand APIRouter's role

    APIRouter is designed to group related routes together for better organization.
  2. Step 2: Compare with other options

    It does not replace the main app, generate models, or handle background tasks.
  3. Final Answer:

    To organize routes into smaller, manageable groups -> Option D
  4. Quick Check:

    APIRouter groups routes = B [OK]
Hint: APIRouter groups routes for cleaner code [OK]
Common Mistakes:
  • Thinking APIRouter replaces FastAPI app
  • Confusing APIRouter with database tools
  • Assuming APIRouter handles tasks beyond routing
2. Which of the following is the correct way to include a router with a prefix in a FastAPI app?
easy
A. app.include_router(router, prefix='/items')
B. app.add_router(router, prefix='/items')
C. app.include_router(router, path='/items')
D. app.register_router(router, prefix='/items')

Solution

  1. Step 1: Recall the method to add routers

    The correct method is include_router() with a prefix argument.
  2. Step 2: Check method names and parameters

    Only include_router() with prefix is valid; others are incorrect method names or parameters.
  3. Final Answer:

    app.include_router(router, prefix='/items') -> Option A
  4. Quick Check:

    Use include_router with prefix = A [OK]
Hint: Use include_router() with prefix to add routes [OK]
Common Mistakes:
  • Using wrong method names like add_router or register_router
  • Using 'path' instead of 'prefix' argument
  • Forgetting to include the router at all
3. Given this code snippet, what will be the URL path to access the read_users endpoint?
from fastapi import FastAPI, APIRouter

router = APIRouter()

@router.get('/users')
async def read_users():
    return {'users': ['Alice', 'Bob']}

app = FastAPI()
app.include_router(router, prefix='/api')
medium
A. /users
B. /users/api
C. /api/users
D. /api

Solution

  1. Step 1: Identify the route path in the router

    The route is defined as /users inside the router.
  2. Step 2: Check the prefix used when including the router

    The router is included with prefix /api, so the full path is /api/users.
  3. Final Answer:

    /api/users -> Option C
  4. Quick Check:

    Prefix + route path = /api/users [OK]
Hint: Full path = prefix + router path [OK]
Common Mistakes:
  • Ignoring the prefix when accessing the route
  • Confusing route path with prefix
  • Assuming prefix replaces route path
4. What is wrong with this FastAPI router setup?
from fastapi import FastAPI, APIRouter

router = APIRouter()

@router.get('/items')
async def get_items():
    return ['item1', 'item2']

app = FastAPI()
app.include_router(router, prefix='/')

@app.get('/items')
async def root_items():
    return ['root item']
medium
A. The prefix causes route conflict with root app route
B. APIRouter cannot be included with prefix
C. Router path must start with '/api'
D. The router function must be synchronous

Solution

  1. Step 1: Analyze route paths

    The router has a route at /items and is included with prefix /, making its full path /items.
  2. Step 2: Check for conflicts

    The main app also has a route at /items. This causes a direct route conflict.
  3. Step 3: Identify the actual problem

    The prefix causes the router path to overlap with the root app route.
  4. Final Answer:

    The prefix causes route conflict with root app route -> Option A
  5. Quick Check:

    Prefix and root route clash = A [OK]
Hint: Avoid prefix same as root route path [OK]
Common Mistakes:
  • Thinking APIRouter can't use prefix
  • Assuming router paths must start with /api
  • Believing async functions must be sync
5. You want to create two routers: one for user routes with prefix /users and one for item routes with prefix /items. How should you include them in your FastAPI app to avoid route conflicts and keep code modular?
hard
A. Define all routes directly in the main FastAPI app without routers
B. Create two APIRouter instances, define routes, then include both with their prefixes in the main app
C. Create one APIRouter with all routes and include it without prefixes
D. Use one APIRouter and change prefixes dynamically inside route functions

Solution

  1. Step 1: Understand modular routing

    Using separate APIRouter instances for users and items keeps routes organized and modular.
  2. Step 2: Include routers with distinct prefixes

    Including each router with its own prefix (/users and /items) avoids conflicts and clarifies URLs.
  3. Step 3: Avoid other options

    Single router or no routers reduce modularity; dynamic prefix changes are not standard practice.
  4. Final Answer:

    Create two APIRouter instances, define routes, then include both with their prefixes in the main app -> Option B
  5. Quick Check:

    Separate routers + prefixes = modular, no conflicts [OK]
Hint: Use separate routers with prefixes for modularity [OK]
Common Mistakes:
  • Putting all routes in one router without prefixes
  • Defining routes only in main app losing modularity
  • Trying to change prefixes inside route functions
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