Option A organizes the project into clear folders for API versions, core configuration, and utilities. This structure supports scalability by isolating endpoints and models per version.
from fastapi import APIRouter router = APIRouter(prefix='/users') @router.get('/') async def get_users(): return ['Alice', 'Bob'] from fastapi import FastAPI from api.v1.users import router as users_router app = FastAPI() app.include_router(users_router, prefix='/v1')
The router in users.py has prefix '/users'. It is included in main.py with prefix '/v1'. These prefixes combine, so the full path is '/v1/users/'.
Option C uses correct Python import syntax with dots and imports the router object directly.
Option C uses slashes which is invalid syntax.
Option C tries to import a module path as a single name, which is invalid.
Option C tries to import an attribute with dot notation inside import, which is invalid.
Option A is correct. The router has prefix '/users' and the endpoint path is '/users', combined with the app's include_router prefix '/v1', making the full path '/v1/users/users'. Visiting '/v1/users' therefore returns 404.
Option A is incorrect because @router.get is the proper decorator when using APIRouter.
Option A is incorrect; users.py is a module and doesn't require __init__.py.
Option A is incorrect; prefix on include_router is valid and useful for versioning.
from fastapi import APIRouter # users.py router = APIRouter(prefix='/users') @router.get('/') async def get_users(): return ['user1'] # items.py router = APIRouter(prefix='/items') @router.get('/') async def get_items(): return ['item1'] # main.py from fastapi import FastAPI from api.v1.users import router as users_router from api.v1.items import router as items_router app = FastAPI() app.include_router(users_router, prefix='/v1') app.include_router(items_router, prefix='/v1')
The items router has prefix '/items' and is included with prefix '/v1', so the full path is '/v1/items/'. The endpoint returns ['item1'], so the response is ['item1'].