Bird
Raised Fist0
FastAPIframework~5 mins

Request timing middleware in FastAPI - Cheat Sheet & Quick Revision

Choose your learning style10 modes available

Start learning this pattern below

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
Recall & Review
beginner
What is the purpose of request timing middleware in FastAPI?
Request timing middleware measures how long each HTTP request takes to process. It helps developers understand performance and find slow parts in their app.
Click to reveal answer
beginner
How do you add middleware in FastAPI?
You use the @app.middleware decorator with 'http' as the first argument. Then define an async function that takes request and call_next parameters.
Click to reveal answer
intermediate
In request timing middleware, what does the call_next(request) function do?
call_next(request) passes the request to the next step in the app (like route handlers) and returns the response. It lets middleware run code before and after the request.
Click to reveal answer
intermediate
Why use time.monotonic() instead of time.time() for measuring request duration?
time.monotonic() always moves forward and is not affected by system clock changes, making it reliable for measuring elapsed time.
Click to reveal answer
intermediate
How can you add the request duration to the HTTP response headers in FastAPI middleware?
After getting the response from call_next, add a header like response.headers['X-Process-Time'] = str(duration). This sends timing info back to the client.
Click to reveal answer
What is the correct way to define a request timing middleware in FastAPI?
AUse @app.middleware('http') and an async function with request and call_next parameters
BUse @app.route and a sync function with request only
CUse @app.middleware('ws') and an async function with websocket parameter
DUse @app.event and a function with no parameters
Which Python function is best for measuring elapsed time in request timing middleware?
Atime.monotonic()
Btime.sleep()
Ctime.time()
Dtime.clock()
What does call_next(request) return in FastAPI middleware?
AA boolean value
BThe request object
CThe middleware function
DThe HTTP response object
Where can you add the request duration information so the client can see it?
AIn the request body
BIn the response headers
CIn the URL path
DIn the server logs only
Why is middleware useful for timing requests?
AIt replaces route handlers
BIt only runs once when the app starts
CIt runs code before and after every request automatically
DIt blocks requests from reaching routes
Explain how to create a request timing middleware in FastAPI and how it measures request duration.
Think about how middleware wraps the request and response process.
You got /7 concepts.
    Why is it important to use middleware for timing requests instead of adding timing code in each route?
    Consider the benefits of code reuse and consistency.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of a request timing middleware in FastAPI?
      easy
      A. To convert JSON data to Python objects
      B. To handle user authentication automatically
      C. To serve static files faster
      D. To measure how long each HTTP request takes to process

      Solution

      1. Step 1: Understand middleware role

        Middleware runs code before and after each request to add extra features.
      2. Step 2: Identify timing middleware purpose

        Request timing middleware specifically measures the time taken to process requests.
      3. Final Answer:

        To measure how long each HTTP request takes to process -> Option D
      4. Quick Check:

        Request timing = measure duration [OK]
      Hint: Middleware timing measures request duration [OK]
      Common Mistakes:
      • Confusing timing middleware with authentication
      • Thinking it serves static files
      • Assuming it parses JSON data
      2. Which of the following is the correct way to define a request timing middleware in FastAPI?
      easy
      A. @app.middleware('websocket')\nasync def timing_middleware(request, call_next):\n pass
      B. @app.route('/middleware')\ndef timing_middleware(request):\n start = time.time()\n return 'Done'
      C. @app.middleware('http')\nasync def timing_middleware(request, call_next):\n start = time.time()\n response = await call_next(request)\n duration = time.time() - start\n response.headers['X-Process-Time'] = str(duration)\n return response
      D. def timing_middleware(request):\n start = time.time()\n return 'Middleware running'

      Solution

      1. Step 1: Check middleware decorator and signature

        FastAPI HTTP middleware uses @app.middleware('http') and async def with (request, call_next).
      2. Step 2: Verify timing logic and response modification

        It records start time, awaits call_next(request), calculates duration, adds header, and returns response.
      3. Final Answer:

        Correct async HTTP middleware with timing and header addition -> Option C
      4. Quick Check:

        @app.middleware('http') + call_next + timing [OK]
      Hint: Use @app.middleware('http') with async and call_next [OK]
      Common Mistakes:
      • Using @app.route instead of @app.middleware
      • Missing async or call_next parameter
      • Using websocket middleware for HTTP requests
      3. Given this middleware code snippet, what will be added to the response headers after a request is processed?
      import time
      from fastapi import FastAPI
      app = FastAPI()
      
      @app.middleware('http')
      async def add_process_time_header(request, call_next):
          start_time = time.time()
          response = await call_next(request)
          process_time = time.time() - start_time
          response.headers['X-Process-Time'] = str(process_time)
          return response
      medium
      A. A header named 'Content-Length' with the size of the response
      B. A header named 'X-Process-Time' with the request processing duration in seconds
      C. A header named 'X-Request-ID' with a unique request identifier
      D. No headers are added by this middleware

      Solution

      1. Step 1: Analyze header addition in middleware

        The code adds 'X-Process-Time' header with the calculated process_time value.
      2. Step 2: Confirm header content meaning

        This header holds the duration in seconds the request took to process.
      3. Final Answer:

        A header named 'X-Process-Time' with the request processing duration in seconds -> Option B
      4. Quick Check:

        Header 'X-Process-Time' = duration seconds [OK]
      Hint: Look for response.headers assignment for header name [OK]
      Common Mistakes:
      • Confusing header names added by middleware
      • Assuming no headers are added
      • Thinking it adds request ID or content length
      4. Identify the error in this FastAPI request timing middleware code:
      import time
      from fastapi import FastAPI
      app = FastAPI()
      
      @app.middleware('http')
      def timing_middleware(request, call_next):
          start = time.time()
          response = call_next(request)
          duration = time.time() - start
          response.headers['X-Time'] = str(duration)
          return response
      medium
      A. Missing async keyword and missing await before call_next(request)
      B. Using time.time() instead of datetime.now()
      C. Response headers cannot be modified in middleware
      D. Middleware should be defined with @app.route decorator

      Solution

      1. Step 1: Check function signature and async usage

        Middleware must be async and await call_next(request) because call_next is async.
      2. Step 2: Identify missing await and async

        Code lacks async def and await, causing runtime errors.
      3. Final Answer:

        Missing async keyword and missing await before call_next(request) -> Option A
      4. Quick Check:

        Async + await call_next required [OK]
      Hint: Middleware must be async and await call_next(request) [OK]
      Common Mistakes:
      • Forgetting async keyword on middleware function
      • Not awaiting call_next(request)
      • Using wrong decorator like @app.route
      5. You want to create a request timing middleware that logs the duration only if it exceeds 0.5 seconds. Which code snippet correctly implements this behavior?
      hard
      A. @app.middleware('http')\nasync def timing_middleware(request, call_next):\n start = time.time()\n response = await call_next(request)\n duration = time.time() - start\n if duration > 0.5:\n print(f'Request took {duration:.3f} seconds')\n return response
      B. @app.middleware('http')\ndef timing_middleware(request, call_next):\n start = time.time()\n response = call_next(request)\n duration = time.time() - start\n if duration > 0.5:\n print('Slow request')\n return response
      C. @app.middleware('http')\nasync def timing_middleware(request, call_next):\n response = await call_next(request)\n duration = time.time()\n if duration > 0.5:\n print('Request slow')\n return response
      D. @app.middleware('http')\nasync def timing_middleware(request, call_next):\n start = time.time()\n response = await call_next(request)\n duration = start - time.time()\n if duration > 0.5:\n print('Request slow')\n return response

      Solution

      1. Step 1: Confirm async middleware and await call_next

        Middleware must be async and await call_next(request) to work properly.
      2. Step 2: Check timing calculation and conditional logging

        Duration is end time minus start time; log only if duration > 0.5 seconds.
      3. Step 3: Verify correct duration calculation and print statement

        Code with start = time.time(), await call_next, duration = time.time() - start, if duration > 0.5: print(f'Request took {duration:.3f} seconds') correctly calculates duration and prints formatted message conditionally.
      4. Final Answer:

        Async middleware with correct timing and conditional logging if duration > 0.5s -> Option A
      5. Quick Check:

        Async + await + correct timing + conditional print [OK]
      Hint: Use async, await, and check duration > 0.5 before logging [OK]
      Common Mistakes:
      • Missing async or await in middleware
      • Calculating duration incorrectly (start - end)
      • Logging unconditionally or not at all