Bird
Raised Fist0
FastAPIframework~10 mins

Multiple response types in FastAPI - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Multiple response types
Client sends request
↓
FastAPI endpoint receives
↓
Check request details
↓
Decide response type
↓
Return JSON
↓
Client receives response
FastAPI checks the request and decides which response type to send back, like JSON or HTML.
Execution Sample
FastAPI
from fastapi import FastAPI
from fastapi.responses import HTMLResponse

app = FastAPI()

@app.get("/", response_class=HTMLResponse)
async def root():
    return "<h1>Hello HTML</h1>"
This code sends an HTML response when the root URL is accessed.
Execution Table
StepActionRequest TypeResponse TypeReturned Content
1Client sends GET /GET /Check endpointNone
2FastAPI matches route /GET /Determine response_classHTMLResponse
3Call root() functionGET /Prepare HTML content"<h1>Hello HTML</h1>"
4Send response to clientGET /HTMLResponse<h1>Hello HTML</h1>
5Client receives responseGET /HTML contentPage shows 'Hello HTML' in heading
💡 Response sent and client received the HTML content
Variable Tracker
VariableStartAfter Step 3Final
response_classNoneHTMLResponseHTMLResponse
returned_contentNone"<h1>Hello HTML</h1>""<h1>Hello HTML</h1>"
Key Moments - 2 Insights
Why does FastAPI send HTML instead of plain text here?
Because the endpoint uses response_class=HTMLResponse, FastAPI knows to send HTML, as shown in execution_table step 2.
What happens if we don't specify response_class?
FastAPI defaults to JSONResponse for dict returns and PlainTextResponse for string returns, so it would send plain text instead of HTML. This is implied by the check in step 2.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the response_class at step 2?
AHTMLResponse
BJSONResponse
CPlainTextResponse
DNone
💡 Hint
Check the 'Response Type' column at step 2 in the execution_table
At which step does FastAPI prepare the HTML content to send?
AStep 1
BStep 4
CStep 3
DStep 5
💡 Hint
Look at the 'Returned Content' column in the execution_table
If we remove response_class=HTMLResponse, what would change in the execution_table?
AClient would receive HTML content
BResponse Type at step 2 would be PlainTextResponse
CReturned Content would be HTML
DNo response would be sent
💡 Hint
Refer to key_moments about default response type when response_class is not set
Concept Snapshot
FastAPI endpoints can return different response types.
Use response_class parameter to specify type like HTMLResponse.
Default is PlainTextResponse if not set for string returns.
This controls how data is sent to the client.
Helps serve JSON, HTML, plain text, or files easily.
Full Transcript
This visual trace shows how FastAPI handles multiple response types. When a client sends a request, FastAPI matches the route and checks the response_class. If HTMLResponse is set, it calls the endpoint function and prepares HTML content. Then it sends this HTML back to the client. Variables like response_class and returned_content change during execution. Beginners often wonder why HTML is sent instead of plain text; it's because of the response_class setting. If not set, FastAPI defaults to PlainTextResponse for string returns. This trace helps understand how FastAPI decides what to send back.

Practice

(1/5)
1. What is the main purpose of using multiple response types in a FastAPI route?
easy
A. To speed up the API response time by caching
B. To allow the API to send different response formats based on conditions
C. To restrict the API to only one response format
D. To automatically generate database schemas

Solution

  1. Step 1: Understand response types in FastAPI

    Multiple response types let an API send different formats like JSON or HTML depending on the request or logic.
  2. Step 2: Identify the purpose

    This flexibility helps clients get the response format they expect or need.
  3. Final Answer:

    To allow the API to send different response formats based on conditions -> Option B
  4. Quick Check:

    Multiple response types = different formats [OK]
Hint: Multiple response types mean flexible output formats [OK]
Common Mistakes:
  • Thinking it speeds up response time
  • Believing it restricts to one format
  • Confusing with database schema generation
2. Which of the following is the correct way to declare multiple response types in a FastAPI route decorator?
easy
A. @app.get('/items', responses={200: {'content': {'application/json': {}}}})
B. @app.get('/items', response_formats=['json', 'html'])
C. @app.get('/items', response_type=['json', 'html'])
D. @app.get('/items', responses={200: {'content': {'application/json': {}, 'text/html': {}}}})

Solution

  1. Step 1: Review FastAPI response declaration syntax

    FastAPI uses the 'responses' parameter with status codes and content types as keys.
  2. Step 2: Identify correct syntax for multiple types

    @app.get('/items', responses={200: {'content': {'application/json': {}, 'text/html': {}}}}) correctly shows multiple content types under the 200 status code.
  3. Final Answer:

    @app.get('/items', responses={200: {'content': {'application/json': {}, 'text/html': {}}}}) -> Option D
  4. Quick Check:

    responses param with content dict = @app.get('/items', responses={200: {'content': {'application/json': {}, 'text/html': {}}}}) [OK]
Hint: Use 'responses' with content dict for multiple types [OK]
Common Mistakes:
  • Using non-existent parameters like response_type
  • Declaring only one content type when multiple needed
  • Incorrect dictionary structure in responses
3. Given this FastAPI route, what will be the response content type if return HTMLResponse(content='Hello') is used?
from fastapi import FastAPI
from fastapi.responses import JSONResponse, HTMLResponse

app = FastAPI()

@app.get('/greet', responses={200: {'content': {'application/json': {}, 'text/html': {}}}})
async def greet(html: bool = False):
    if html:
        return HTMLResponse(content='Hello')
    return JSONResponse(content={'message': 'Hello'})
medium
A. text/html
B. application/json
C. application/xml
D. text/plain

Solution

  1. Step 1: Check the return type when html=True

    The function returns HTMLResponse with content 'Hello' when html is True.
  2. Step 2: Identify the content type of HTMLResponse

    HTMLResponse sets the content type to 'text/html'.
  3. Final Answer:

    text/html -> Option A
  4. Quick Check:

    HTMLResponse = text/html [OK]
Hint: HTMLResponse means content type text/html [OK]
Common Mistakes:
  • Assuming JSONResponse is always returned
  • Confusing content type with return value
  • Ignoring the condition that triggers HTMLResponse
4. Identify the error in this FastAPI route that tries to return multiple response types:
from fastapi import FastAPI
from fastapi.responses import JSONResponse, PlainTextResponse

app = FastAPI()

@app.get('/data', responses={200: {'content': {'application/json': {}, 'text/plain': {}}}})
async def data(response_type: str):
    if response_type == 'json':
        return JSONResponse(content={'key': 'value'})
    else:
        return 'Just plain text'
medium
A. responses dictionary is incorrectly formatted
B. Missing import for PlainTextResponse
C. Returning a plain string instead of a Response object for plain text
D. Function should not be async

Solution

  1. Step 1: Check return types in the function

    When response_type is not 'json', the function returns a plain string instead of a Response object.
  2. Step 2: Understand FastAPI response requirements

    FastAPI expects a Response object like PlainTextResponse for non-JSON responses to set headers correctly.
  3. Final Answer:

    Returning a plain string instead of a Response object for plain text -> Option C
  4. Quick Check:

    Plain string return needs PlainTextResponse [OK]
Hint: Return Response objects, not raw strings for non-JSON [OK]
Common Mistakes:
  • Returning raw strings instead of Response objects
  • Ignoring response content type headers
  • Assuming async is not needed
5. You want a FastAPI route to return JSON by default but HTML if a query parameter ?format=html is given. Which approach correctly implements this with multiple response types?
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse, HTMLResponse

app = FastAPI()

@app.get('/info', responses={200: {'content': {'application/json': {}, 'text/html': {}}}})
async def info(request: Request):
    format = request.query_params.get('format')
    if format == 'html':
        # What to return here?
    else:
        return JSONResponse(content={'info': 'data'})
hard
A. return HTMLResponse(content='

Info

')
B. return {'info': '

Info

'}
C. return JSONResponse(content={'info': '

Info

'})
D. return Response(content='

Info

', media_type='application/json')

Solution

  1. Step 1: Check the condition for HTML format

    If the query parameter 'format' equals 'html', the route should return an HTML response.
  2. Step 2: Use the correct response class for HTML

    HTMLResponse sets the content type to 'text/html' and sends HTML content properly.
  3. Final Answer:

    return HTMLResponse(content='<h1>Info</h1>') -> Option A
  4. Quick Check:

    HTMLResponse for HTML output = return HTMLResponse(content='<h1>Info</h1>') [OK]
Hint: Use HTMLResponse to send HTML content explicitly [OK]
Common Mistakes:
  • Returning dict with HTML string instead of HTMLResponse
  • Using JSONResponse with HTML content type
  • Setting wrong media_type in Response
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