Bird
Raised Fist0
Flaskframework~20 mins

WSGI middleware concept in Flask - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
WSGI Middleware Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What does this WSGI middleware do to the response?
Consider this WSGI middleware wrapping a Flask app. What will be the final response body sent to the client?
Flask
class SimpleMiddleware:
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        def custom_start_response(status, headers, exc_info=None):
            headers.append(('X-Custom-Header', 'Middleware'))
            return start_response(status, headers, exc_info)

        response = self.app(environ, custom_start_response)
        modified_response = []
        for data in response:
            modified_response.append(data.upper())
        return modified_response

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return 'hello world'

app.wsgi_app = SimpleMiddleware(app.wsgi_app)
AThe client receives 'HELLO WORLD' with an extra header 'X-Custom-Header: Middleware'.
BThe client receives 'hello world' with no extra headers.
CThe client receives 'HELLO WORLD' but no extra headers.
DThe client receives 'hello world' with an extra header 'X-Custom-Header: Middleware'.
Attempts:
2 left
💡 Hint
Think about how the middleware modifies both headers and response body.
❓ lifecycle
intermediate
1:30remaining
When is the WSGI middleware __call__ method executed?
In a Flask app wrapped by WSGI middleware, at what point is the middleware's __call__ method triggered?
AOnly once when the Flask app starts.
BEach time the Flask app receives an HTTP request.
COnly when the Flask app sends a response.
DOnly when the Flask app raises an error.
Attempts:
2 left
💡 Hint
Think about what WSGI middleware wraps and how requests flow.
🔧 Debug
advanced
2:30remaining
Why does this WSGI middleware cause a TypeError?
This middleware tries to modify the response but causes a TypeError. Why?
Flask
class FaultyMiddleware:
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        response = self.app(environ, start_response)
        return response.upper()
ABecause start_response is called twice causing a TypeError.
BBecause the middleware forgot to call start_response.
CBecause response is an iterable, not a string, so .upper() is invalid.
DBecause the app does not return any response causing NoneType error.
Attempts:
2 left
💡 Hint
Check the type of the response returned by the app.
📝 Syntax
advanced
2:00remaining
Which option correctly adds a header in WSGI middleware?
Select the code snippet that correctly adds a custom header 'X-Test: Yes' in WSGI middleware.
A
def __call__(self, environ, start_response):
    def custom_start(status, headers):
        headers.append(('X-Test', 'Yes'))
        return start_response(status, headers)
    return self.app(environ, custom_start)
B
def __call__(self, environ, start_response):
    headers = [('X-Test', 'Yes')]
    start_response('200 OK', headers)
    return self.app(environ, start_response)
C
def __call__(self, environ, start_response):
    start_response('200 OK', [('X-Test', 'Yes')])
    return self.app(environ, start_response)
D
def __call__(self, environ, start_response):
    def custom_start(status, headers, exc_info=None):
        headers.append(('X-Test', 'Yes'))
        return start_response(status, headers, exc_info)
    return self.app(environ, custom_start)
Attempts:
2 left
💡 Hint
Remember the start_response signature and how to wrap it.
🧠 Conceptual
expert
3:00remaining
What is the main benefit of using WSGI middleware in Flask apps?
Why would a developer add WSGI middleware around a Flask app instead of modifying the Flask app code directly?
ATo add reusable functionality like logging or headers without changing the app code.
BTo speed up the Flask app by bypassing Flask's routing system.
CTo convert Flask apps into asynchronous apps automatically.
DTo replace Flask's request handling with a different framework.
Attempts:
2 left
💡 Hint
Think about separation of concerns and reusability.

Practice

(1/5)
1. What is the main role of WSGI middleware in a Flask application?
easy
A. To serve static files directly to the client
B. To replace the Flask app entirely
C. To sit between the server and the Flask app to modify requests or responses
D. To handle database connections automatically

Solution

  1. Step 1: Understand WSGI middleware position

    WSGI middleware acts as a layer between the web server and the Flask app, intercepting requests and responses.
  2. Step 2: Identify middleware purpose

    It modifies or adds features like logging or security without replacing the app or handling unrelated tasks.
  3. Final Answer:

    To sit between the server and the Flask app to modify requests or responses -> Option C
  4. Quick Check:

    Middleware = intercepts requests/responses [OK]
Hint: Middleware wraps app to add features between server and app [OK]
Common Mistakes:
  • Thinking middleware replaces the app
  • Confusing middleware with static file serving
  • Assuming middleware manages database connections
2. Which of the following is the correct way to wrap a Flask app with WSGI middleware named MyMiddleware?
easy
A. app = MyMiddleware(app)
B. app = app.MyMiddleware()
C. MyMiddleware(app)
D. app.middleware = MyMiddleware

Solution

  1. Step 1: Recall middleware wrapping syntax

    WSGI middleware wraps the Flask app by passing the app instance to the middleware constructor.
  2. Step 2: Match correct syntax

    The correct syntax is assigning the wrapped app back to app using app = MyMiddleware(app).
  3. Final Answer:

    app = MyMiddleware(app) -> Option A
  4. Quick Check:

    Wrap app by passing it to middleware constructor [OK]
Hint: Wrap app by calling middleware with app as argument [OK]
Common Mistakes:
  • Calling middleware as a method on app
  • Not assigning wrapped app back to a variable
  • Assigning middleware class without instantiation
3. Given this WSGI middleware code wrapping a Flask app, what will be printed when a request is made?
class SimpleMiddleware:
    def __init__(self, app):
        self.app = app
    def __call__(self, environ, start_response):
        print('Before app')
        response = self.app(environ, start_response)
        print('After app')
        return response

app = Flask(__name__)
app = SimpleMiddleware(app)
medium
A. No output is printed
B. Only Before app is printed
C. Only After app is printed
D. Before app printed before request, After app printed after request

Solution

  1. Step 1: Analyze middleware call flow

    The middleware prints 'Before app' before calling the wrapped app, then prints 'After app' after the app returns.
  2. Step 2: Understand request handling

    When a request comes, both print statements execute in order around the app call.
  3. Final Answer:

    Before app printed before request, After app printed after request -> Option D
  4. Quick Check:

    Middleware prints before and after app call [OK]
Hint: Middleware __call__ runs code before and after app call [OK]
Common Mistakes:
  • Assuming only one print runs
  • Thinking prints happen asynchronously
  • Confusing middleware with Flask route handlers
4. Identify the error in this WSGI middleware implementation:
class BrokenMiddleware:
    def __init__(self, app):
        self.app = app
    def __call__(self, environ, start_response):
        # Forgot to call the wrapped app
        return 'Hello'
medium
A. Middleware must call the wrapped app and return its response
B. Middleware should not have an __init__ method
C. Middleware should return a Flask response object, not a string
D. Middleware must not accept environ and start_response parameters

Solution

  1. Step 1: Check middleware call method

    The __call__ method must call the wrapped app with environ and start_response to get the response.
  2. Step 2: Identify missing call

    This code returns a string directly and does not call the wrapped app, breaking the WSGI chain.
  3. Final Answer:

    Middleware must call the wrapped app and return its response -> Option A
  4. Quick Check:

    Middleware must call wrapped app [OK]
Hint: Middleware must call and return wrapped app response [OK]
Common Mistakes:
  • Returning a string instead of calling app
  • Removing __init__ method unnecessarily
  • Misunderstanding WSGI call signature
5. You want to add a WSGI middleware to your Flask app that adds a custom header X-Custom-Header: Hello to every response. Which approach correctly implements this?
hard
A. Wrap the app and modify the start_response to add the header after calling the app
B. Wrap the app and modify the start_response to add the header before calling the app
C. Modify the Flask app routes to add the header manually in each view
D. Add the header in the middleware by modifying the response iterable directly without start_response

Solution

  1. Step 1: Understand start_response role

    start_response is a callable that sets HTTP status and headers before the response body is sent.
  2. Step 2: Add header by wrapping start_response

    Middleware should wrap start_response to add the custom header before passing it to the app, so when the app calls it, the header is added.
  3. Final Answer:

    Wrap the app and modify the start_response to add the header before calling the app -> Option B
  4. Quick Check:

    Add headers by wrapping start_response before app call [OK]
Hint: Wrap start_response to add headers before app call [OK]
Common Mistakes:
  • Adding headers after calling app (too late, start_response already called by app)
  • Modifying response iterable directly (not standard for headers)
  • Changing all routes instead of middleware
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