Bird
Raised Fist0
Flaskframework~10 mins

Why middleware extends functionality in Flask - Test Your Understanding

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to add middleware that logs each request in Flask.

Flask
from flask import Flask, request

app = Flask(__name__)

@app.before_request
def [1]():
    print(f"Request to: {request.path}")

@app.route('/')
def home():
    return 'Hello!'
Drag options to blanks, or click blank then click option'
Ahandle_request
Bbefore_request
Clog_request
Dprocess_request
Attempts:
3 left
💡 Hint
Common Mistakes
Using a function name that doesn't describe its purpose
Not using the @app.before_request decorator
2fill in blank
medium

Complete the code to create middleware that modifies the response headers.

Flask
from flask import Flask, Response

app = Flask(__name__)

@app.after_request
def add_header(response: Response):
    response.headers['X-Custom-Header'] = [1]
    return response

@app.route('/')
def home():
    return 'Hello!'
Drag options to blanks, or click blank then click option'
A'Middleware-Active'
B'Active-Middleware'
C'Custom-Header'
D'Header-Set'
Attempts:
3 left
💡 Hint
Common Mistakes
Using a header value that doesn't clearly indicate middleware
Forgetting to return the response object
3fill in blank
hard

Fix the error in the middleware function that blocks requests to '/secret'.

Flask
from flask import Flask, request, abort

app = Flask(__name__)

@app.before_request
def block_secret():
    if request.path == [1]:
        abort(403)

@app.route('/secret')
def secret():
    return 'Top secret!'
Drag options to blanks, or click blank then click option'
A'/secret'
B'secret/'
C'/Secret'
D'secret'
Attempts:
3 left
💡 Hint
Common Mistakes
Using a path without the leading slash
Using incorrect casing in the path string
4fill in blank
hard

Fill both blanks to create middleware that measures request processing time and adds it to response headers.

Flask
import time
from flask import Flask, g, request

app = Flask(__name__)

@app.before_request
def start_timer():
    g.start = [1]

@app.after_request
def add_duration(response):
    duration = time.time() - g.start
    response.headers['X-Duration'] = str(duration) + [2]
    return response
Drag options to blanks, or click blank then click option'
Atime.time()
B' seconds'
C' ms'
Dtime.perf_counter()
Attempts:
3 left
💡 Hint
Common Mistakes
Using time.perf_counter() which is more precise but less common here
Forgetting to convert duration to string before concatenation
5fill in blank
hard

Fill all three blanks to create middleware that modifies request data and response data.

Flask
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.before_request
def modify_request():
    if request.is_json:
        data = request.get_json()
        data[[1]] = [2]
        request.json = data

@app.after_request
def modify_response(response):
    if response.is_json:
        json_data = response.get_json()
        json_data[[3]] = 'modified by middleware'
        response.set_data(jsonify(json_data).get_data())
    return response
Drag options to blanks, or click blank then click option'
A'middleware_flag'
BTrue
C'middleware_status'
D'status'
Attempts:
3 left
💡 Hint
Common Mistakes
Using keys that don't match between request and response
Not updating the response data properly after modification

Practice

(1/5)
1. What is the main purpose of middleware in a Flask application?
easy
A. To add extra processing steps before or after the main app handles a request
B. To replace the Flask app's routing system
C. To directly modify the database schema
D. To serve static files like images and CSS

Solution

  1. Step 1: Understand middleware role

    Middleware acts as a layer that processes requests or responses around the main app logic.
  2. Step 2: Compare options

    Replacing routing, modifying database schema, or serving static files are not middleware tasks.
  3. Final Answer:

    To add extra processing steps before or after the main app handles a request -> Option A
  4. Quick Check:

    Middleware extends app functionality = C [OK]
Hint: Middleware adds steps around app requests and responses [OK]
Common Mistakes:
  • Thinking middleware replaces routing
  • Confusing middleware with static file serving
  • Assuming middleware changes database structure
2. Which of the following is the correct way to add middleware in a Flask app?
easy
A. app = Middleware(app)
B. app.middleware = Middleware()
C. Middleware(app).run()
D. app.add_middleware(Middleware)

Solution

  1. Step 1: Recall Flask middleware pattern

    Middleware wraps the Flask app by passing the app instance to the middleware constructor.
  2. Step 2: Analyze options

    Only app = Middleware(app) correctly wraps the app instance. Others use invalid syntax or methods not in Flask.
  3. Final Answer:

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

    Middleware wraps app instance = A [OK]
Hint: Middleware wraps app like a gift box around it [OK]
Common Mistakes:
  • Trying to assign middleware as an attribute
  • Calling run() on middleware instead of app
  • Using non-existent add_middleware method
3. Given this middleware code, 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 = SimpleMiddleware(app)
medium
A. No output printed
B. Only Before app printed
C. Only After app printed
D. Before app printed, then After app printed

Solution

  1. Step 1: Understand __call__ method flow

    When a request comes, 'Before app' prints, then the wrapped app runs, then 'After app' prints.
  2. Step 2: Confirm both prints execute

    Both print statements are before and after calling the app, so both appear in order.
  3. Final Answer:

    Before app printed, then After app printed -> Option D
  4. Quick Check:

    Middleware prints before and after app = A [OK]
Hint: Middleware prints before and after calling app [OK]
Common Mistakes:
  • Thinking only one print runs
  • Assuming prints happen in reverse order
  • Forgetting __call__ runs on each request
4. This middleware code causes an error. What is the problem?
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 return a number, not a string
B. Middleware must call the wrapped app to return a valid response
C. Middleware should not have a __call__ method
D. Middleware __init__ method is missing

Solution

  1. Step 1: Check __call__ method behavior

    The middleware returns a string directly without calling the wrapped app, breaking the request flow.
  2. Step 2: Understand Flask middleware contract

    Middleware must call the wrapped app to get a valid response object, then return it.
  3. Final Answer:

    Middleware must call the wrapped app to return a valid response -> Option B
  4. Quick Check:

    Middleware must call app = D [OK]
Hint: Middleware must call wrapped app to work properly [OK]
Common Mistakes:
  • Returning a string instead of calling app
  • Missing __call__ method entirely
  • Thinking middleware returns numbers
5. You want to add middleware that logs request paths and modifies the response to add a custom header. Which approach correctly extends functionality using middleware?
hard
A. Modify the Flask app routes to log and add headers directly inside each route function
B. Use middleware that only logs requests but does not call the app
C. Create middleware that logs environ['PATH_INFO'], calls the app, then adds header to response before returning
D. Add a middleware that replaces the response with a fixed string ignoring the app

Solution

  1. Step 1: Understand middleware responsibilities

    Middleware should handle logging before calling the app and modify the response after.
  2. Step 2: Evaluate options

    Create middleware that logs environ['PATH_INFO'], calls the app, then adds header to response before returning correctly logs the request path, calls the app, then modifies the response headers. Others either bypass app or do tasks incorrectly.
  3. Final Answer:

    Create middleware that logs environ['PATH_INFO'], calls the app, then adds header to response before returning -> Option C
  4. Quick Check:

    Middleware logs and modifies response = B [OK]
Hint: Middleware wraps app: log before, modify response after [OK]
Common Mistakes:
  • Modifying routes instead of middleware
  • Not calling the wrapped app
  • Replacing response ignoring app output
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