Custom response classes let you control how your FastAPI app sends data back to users. This helps you change the format, headers, or style of the response easily.
Custom response classes in FastAPI
from fastapi import FastAPI app = FastAPI() @app.get("/path", response_class=ResponseClassName) def function_name(): return ResponseClassName(content, media_type="type")
Replace ResponseClassName with the FastAPI response class you want, like PlainTextResponse or HTMLResponse.
The content is the data you want to send back, and media_type tells the browser how to handle it.
from fastapi import FastAPI from fastapi.responses import PlainTextResponse app = FastAPI() @app.get("/text", response_class=PlainTextResponse) def get_text(): return "Hello, this is plain text!"
from fastapi import FastAPI from fastapi.responses import HTMLResponse app = FastAPI() @app.get("/html", response_class=HTMLResponse) def get_html(): return "<h1>Welcome to FastAPI!</h1>"
from fastapi import FastAPI from fastapi.responses import JSONResponse app = FastAPI() @app.get("/custom-json", response_class=JSONResponse) def get_custom_json(): return JSONResponse(content={"message": "Custom JSON response"}, status_code=202)
This FastAPI app has two routes. One returns a full HTML page, and the other returns plain text. Both use custom response classes to tell FastAPI how to send the data.
from fastapi import FastAPI from fastapi.responses import PlainTextResponse, HTMLResponse app = FastAPI() @app.get("/welcome", response_class=HTMLResponse) def welcome(): html_content = """ <html> <head> <title>Welcome Page</title> </head> <body> <h1>Hello, visitor!</h1> <p>This is a custom HTML response.</p> </body> </html> """ return html_content @app.get("/message", response_class=PlainTextResponse) def message(): return "This is a plain text message."
Using custom response classes helps browsers and clients understand the data format better.
You can create your own response classes by extending FastAPI's Response class if needed.
Always set the correct media_type to avoid confusion in clients.
Custom response classes control how FastAPI sends data back.
Use them to send text, HTML, files, or custom JSON easily.
They help make your API responses clear and correct for users and browsers.
Practice
Custom response classes in FastAPI?Solution
Step 1: Understand the role of response classes
Response classes in FastAPI define how data is formatted and sent back to the client, such as JSON, HTML, or plain text.Step 2: Identify the correct purpose
Custom response classes let you control the exact format and headers of the response, improving clarity and compatibility.Final Answer:
To control how FastAPI sends data back to the client -> Option CQuick Check:
Custom response classes = control response format [OK]
- Confusing response classes with database models
- Thinking they handle authentication
- Assuming they manage background tasks
Solution
Step 1: Identify the correct response class for plain text
FastAPI providesPlainTextResponseto send plain text content.Step 2: Check the usage syntax
The correct syntax is to pass the text string as thecontentargument.Final Answer:
return PlainTextResponse(content="Hello World") -> Option AQuick Check:
PlainTextResponse with content string = return PlainTextResponse(content="Hello World") [OK]
- Using JSONResponse for plain text
- Passing non-string content to HTMLResponse
- Using FileResponse for text content
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
app = FastAPI()
@app.get("/", response_class=HTMLResponse)
async def read_root():
return "Welcome
"
Solution
Step 1: Identify the response class used
The route usesresponse_class=HTMLResponse, which sets the content type to HTML.Step 2: Understand the content type sent
HTMLResponse sends content with the headerContent-Type: text/html.Final Answer:
text/html -> Option AQuick Check:
HTMLResponse = text/html content type [OK]
- Assuming JSON is default content type
- Confusing plain text with HTML content type
- Ignoring the response_class parameter
from fastapi import FastAPI
from fastapi.responses import JSONResponse
app = FastAPI()
@app.get("/data")
async def get_data():
return JSONResponse(content=[1, 2, 3], status_code="200")
Solution
Step 1: Check the status_code argument type
Status codes must be integers, but here it is passed as a string "200".Step 2: Understand the impact of wrong type
Passing a string causes a runtime error or unexpected behavior in FastAPI.Final Answer:
status_code should be an integer, not a string -> Option DQuick Check:
Status code must be int, not str [OK]
- Passing status_code as string
- Thinking content must be dict only
- Believing JSONResponse can't be async
Solution
Step 1: Choose the correct response class for file download
StreamingResponse is suitable for sending files or streams with custom headers.Step 2: Set content and headers properly
Content should be bytes, and headers must includeContent-Dispositionto prompt file download with the filename.Final Answer:
Use StreamingResponse with content as bytes and set headers for CSV download -> Option BQuick Check:
StreamingResponse + headers = file download [OK]
- Using JSONResponse for CSV files
- Not setting Content-Disposition header
- Using HTMLResponse for file content
Ready to prove it?
Pass the test and this pattern moves unknown
