Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Trusted Host Middleware in FastAPI
📖 Scenario: You are building a simple web API using FastAPI. To keep your API safe, you want to allow requests only from certain trusted hosts, like your own domain and localhost.
🎯 Goal: Build a FastAPI app that uses the TrustedHostMiddleware to accept requests only from example.com and localhost.
📋 What You'll Learn
Create a FastAPI app instance
Add TrustedHostMiddleware with allowed hosts example.com and localhost
Create a simple root endpoint that returns a welcome message
Run the app so it enforces trusted hosts
💡 Why This Matters
🌍 Real World
TrustedHostMiddleware helps protect your API by allowing requests only from known, safe domains. This prevents some types of attacks and misuse.
💼 Career
Understanding middleware and security features like trusted hosts is important for backend developers building secure web APIs.
Progress0 / 4 steps
1
Create a FastAPI app instance
Import FastAPI from fastapi and create an app instance called app.
FastAPI
Hint
Use from fastapi import FastAPI and then app = FastAPI().
2
Add TrustedHostMiddleware with allowed hosts
Import TrustedHostMiddleware from fastapi.middleware.trustedhost and add it to app with allowed_hosts set to ["example.com", "localhost"].
FastAPI
Hint
Use app.add_middleware(TrustedHostMiddleware, allowed_hosts=["example.com", "localhost"]).
3
Create a root endpoint
Define a GET endpoint at "/" on app that returns a JSON message {"message": "Welcome to the trusted host API!"}.
FastAPI
Hint
Use @app.get("/") decorator and define an async function root that returns the message.
4
Run the FastAPI app
Add the code to run the app with uvicorn when the script is executed directly. Use uvicorn.run(app, host="0.0.0.0", port=8000) inside if __name__ == "__main__".
FastAPI
Hint
Import uvicorn and use if __name__ == "__main__" to run the app.
Practice
(1/5)
1. What is the main purpose of the TrustedHostMiddleware in FastAPI?
easy
A. To block requests from hosts not in the allowed list
B. To speed up the response time of the app
C. To handle database connections securely
D. To manage user authentication tokens
Solution
Step 1: Understand middleware role
The TrustedHostMiddleware is designed to filter incoming requests based on their host header.
Step 2: Identify its security purpose
It blocks requests from hosts not explicitly allowed to protect against host header attacks.
Final Answer:
To block requests from hosts not in the allowed list -> Option A
Quick Check:
TrustedHostMiddleware blocks unknown hosts = D [OK]
Hint: Remember: Trusted hosts means allowed hosts only [OK]
Common Mistakes:
Confusing it with authentication middleware
Thinking it speeds up app performance
Assuming it manages database connections
2. Which of the following is the correct way to add TrustedHostMiddleware to a FastAPI app?
easy
A. app.middleware(TrustedHostMiddleware, allowed=['example.com'])
B. app.add_middleware(TrustedHostMiddleware, allowed_hosts=['example.com'])
C. app.use(TrustedHostMiddleware, hosts=['example.com'])
D. app.add_middleware(TrustedHostMiddleware, hosts=['example.com'])
Solution
Step 1: Recall FastAPI middleware syntax
FastAPI uses app.add_middleware() with the middleware class and keyword arguments.
Step 2: Check correct argument name
The correct argument for allowed hosts is allowed_hosts, not hosts or allowed.
Final Answer:
app.add_middleware(TrustedHostMiddleware, allowed_hosts=['example.com']) -> Option B
Quick Check:
Use add_middleware with allowed_hosts = C [OK]
Hint: Use add_middleware and allowed_hosts keyword [OK]
Common Mistakes:
Using wrong method like app.use()
Passing 'hosts' instead of 'allowed_hosts'
Incorrect argument names like 'allowed'
3. Given this FastAPI app code snippet, what will happen if a request comes from host 'malicious.com'?
A. The request will be redirected to 'example.com'
B. The request will succeed and return 'Hello World'
C. The app will crash with an exception
D. The request will be blocked with a 400 Bad Request error
Solution
Step 1: Check allowed hosts list
The allowed hosts are 'example.com' and 'localhost'. 'malicious.com' is not in this list.
Step 2: Understand middleware behavior on unknown hosts
TrustedHostMiddleware blocks requests from hosts not in the allowed list by returning a 400 error.
Final Answer:
The request will be blocked with a 400 Bad Request error -> Option D
Quick Check:
Unknown host causes 400 error = A [OK]
Hint: Requests from hosts not allowed get 400 error [OK]
Common Mistakes:
Assuming the request passes through
Thinking the app crashes on unknown hosts
Believing the request is redirected automatically
4. Identify the error in this FastAPI app setup using TrustedHostMiddleware:
from fastapi import FastAPI
from starlette.middleware.trustedhost import TrustedHostMiddleware
app = FastAPI()
app.add_middleware(TrustedHostMiddleware, allowed_hosts='example.com')
@app.get('/')
def home():
return {'msg': 'Welcome'}
medium
A. The route function must be async
B. TrustedHostMiddleware is not imported correctly
C. allowed_hosts should be a list, not a string
D. Missing middleware initialization parameters
Solution
Step 1: Check allowed_hosts argument type
The allowed_hosts parameter expects a list of strings, but a single string was given.
Step 2: Understand impact of wrong type
Passing a string instead of a list will cause the middleware to treat each character as a host, leading to incorrect behavior or errors.
Final Answer:
allowed_hosts should be a list, not a string -> Option C
Quick Check:
allowed_hosts must be list = A [OK]
Hint: allowed_hosts always needs a list, not a string [OK]
Common Mistakes:
Passing a single string instead of list
Thinking route functions must be async
Assuming import is incorrect without error
5. You want to allow requests from any subdomain of example.com and also from localhost. Which allowed_hosts list correctly configures TrustedHostMiddleware for this?
hard
A. ['*.example.com', 'localhost']
B. ['example.com', 'localhost']
C. ['example.com/*', 'localhost']
D. ['*example.com', 'localhost']
Solution
Step 1: Understand wildcard usage in allowed_hosts
TrustedHostMiddleware supports wildcards like *.example.com to allow all subdomains.
Step 2: Check each option for correct wildcard syntax
['*.example.com', 'localhost'] uses '*.example.com' which correctly matches all subdomains; others use incorrect patterns.
Final Answer:
['*.example.com', 'localhost'] -> Option A
Quick Check:
Use '*.example.com' for subdomains = B [OK]
Hint: Use '*.domain.com' to allow all subdomains [OK]