Response Handling

Loading concept...

Flask Response Handling: The Restaurant Kitchen 🍽️

Imagine you’re running a restaurant. When a customer orders food, your kitchen (Flask) prepares the dish and sends it back. But it’s not just about the food—it’s about how you serve it. Do you add a special note? Use a fancy plate? Tell them to go to a different table? That’s Response Handling in Flask!


The Response Object: Your Serving Tray

Every time Flask sends something back to the user, it uses a response object. Think of it as the tray your waiter uses to deliver food.

from flask import Flask, Response

app = Flask(__name__)

@app.route('/hello')
def hello():
    # Creating a basic response
    return Response(
        "Hello, World!",
        status=200,
        mimetype='text/plain'
    )

What’s happening?

  • Response(...) creates your serving tray
  • First part is the content (your food)
  • status is like saying “order successful!”
  • mimetype tells the customer what type of dish it is

Setting Response Headers: Special Instructions on the Tray

Headers are like little notes attached to your serving tray. They give extra information!

from flask import Flask, make_response

app = Flask(__name__)

@app.route('/cookie')
def give_cookie():
    resp = make_response("Here's your cookie!")

    # Adding special notes (headers)
    resp.headers['X-Special-Message'] = 'Baked fresh!'
    resp.headers['Cache-Control'] = 'no-cache'

    return resp

Common Headers:

Header What It Does
Content-Type What type of content
Cache-Control Should browser save it?
X-Custom-Header Your own special note

Status Codes: The Kitchen’s Signal

Status codes are like the kitchen’s way of saying what happened. Did the order go well? Was there a problem?

from flask import Flask

app = Flask(__name__)

@app.route('/success')
def success():
    return "All good!", 200  # OK!

@app.route('/not-found')
def not_found():
    return "Oops, we don't have that!", 404

@app.route('/created')
def created():
    return "New item created!", 201

The Number System:

graph TD A[Status Codes] --> B[2xx Success] A --> C[3xx Redirect] A --> D[4xx Client Error] A --> E[5xx Server Error] B --> B1[200 OK] B --> B2[201 Created] C --> C1[302 Found] C --> C2[301 Moved] D --> D1[404 Not Found] D --> D2[400 Bad Request] E --> E1[500 Server Error]

JSON Responses with jsonify: Speaking the Internet’s Language

When your app talks to other programs (like a phone app), they speak JSON. It’s like a universal language everyone understands!

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/user')
def get_user():
    user_data = {
        "name": "Alex",
        "age": 25,
        "hobbies": ["coding", "reading"]
    }

    # jsonify converts Python dict to JSON
    # AND sets correct Content-Type header!
    return jsonify(user_data)

Why use jsonify instead of json.dumps?

Feature jsonify json.dumps
Sets Content-Type Yes ✅ No ❌
Creates Response Yes ✅ No ❌
Handles Unicode Better ✅ Basic

make_response: The Ultimate Tray Builder

Sometimes you need more control over your response. make_response lets you build a custom tray with all the bells and whistles!

from flask import Flask, make_response

app = Flask(__name__)

@app.route('/custom')
def custom_response():
    # Step 1: Create response with content
    resp = make_response("Custom content here")

    # Step 2: Add your custom touches
    resp.status_code = 201
    resp.headers['X-Made-By'] = 'Chef Flask'

    # Step 3: Set a cookie
    resp.set_cookie('visited', 'true')

    return resp

make_response is perfect when you need to:

  • Set custom headers
  • Add cookies
  • Change status codes
  • Modify content before sending

Redirects: “Please Go to Another Table!”

Sometimes you need to send visitors somewhere else. Like when a restaurant moves, they put up a sign saying “We’re now at Main Street!”

from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route('/old-page')
def old_page():
    # Send user to new location
    return redirect('/new-page')

@app.route('/new-page')
def new_page():
    return "Welcome to the new page!"

@app.route('/go-home')
def go_home():
    # Even better: use url_for with redirect
    return redirect(url_for('new_page'))

Types of Redirects:

graph LR A[User visits /old] --> B{redirect} B --> C[301: Permanent Move] B --> D[302: Temporary Move] C --> E[/new-location] D --> E
# Permanent redirect (for SEO)
return redirect('/new-url', code=301)

# Temporary redirect (default)
return redirect('/temporary-spot', code=302)

URL Building with url_for: GPS for Your App

Instead of writing URLs by hand, let Flask build them for you! It’s like having GPS—always knows the right path.

from flask import Flask, url_for

app = Flask(__name__)

@app.route('/user/<username>')
def profile(username):
    return f"Hello, {username}!"

@app.route('/dashboard')
def dashboard():
    # Build URL dynamically
    profile_url = url_for('profile', username='alex')
    # Returns: /user/alex

    return f'Visit profile at: {profile_url}'

Why url_for is amazing:

# Without url_for (fragile)
link = "/user/alex"  # Breaks if route changes!

# With url_for (smart)
link = url_for('profile', username='alex')
# Always correct, even if route changes!

# Add query parameters easily
url_for('search', q='flask', page=2)
# Returns: /search?q=flask&page=2

# Get absolute URL
url_for('profile', username='alex', _external=True)
# Returns: http://yoursite.com/user/alex

Streaming Responses: Serving Buffet Style

Sometimes you have SO much data that you can’t serve it all at once. Streaming lets you send data piece by piece—like a buffet where dishes keep coming!

from flask import Flask, Response

app = Flask(__name__)

@app.route('/stream')
def stream_data():
    def generate():
        # Send data in chunks
        for i in range(5):
            yield f"Chunk {i}\n"

    return Response(
        generate(),
        mimetype='text/plain'
    )

How Streaming Works:

graph TD A[Server starts sending] --> B[Chunk 1 sent] B --> C[Chunk 2 sent] C --> D[Chunk 3 sent] D --> E[...] E --> F[Done!] style A fill:#e8f5e9 style F fill:#e8f5e9

Real-World Example: Streaming a Large File

@app.route('/download')
def download_file():
    def generate_large_file():
        # Imagine reading a huge file
        for line in open('big_file.txt'):
            yield line

    return Response(
        generate_large_file(),
        mimetype='text/plain',
        headers={
            'Content-Disposition':
                'attachment; filename=data.txt'
        }
    )

Putting It All Together: A Complete Example

from flask import (
    Flask, jsonify, make_response,
    redirect, url_for, Response
)

app = Flask(__name__)

@app.route('/')
def home():
    return "Welcome!"

@app.route('/api/data')
def api_data():
    # JSON response with custom header
    data = {"message": "Hello API!"}
    resp = make_response(jsonify(data))
    resp.headers['X-API-Version'] = '1.0'
    return resp

@app.route('/old-api')
def old_api():
    # Redirect to new endpoint
    return redirect(url_for('api_data'))

@app.route('/events')
def events():
    # Streaming response
    def stream():
        for i in range(3):
            yield f"event: {i}\n"
    return Response(stream(), mimetype='text/plain')

Quick Reference

Task How to Do It
Return text return "Hello"
Return JSON return jsonify(data)
Set status return "OK", 200
Set headers resp.headers['X-Key'] = 'value'
Redirect return redirect(url_for('route'))
Build URL url_for('function_name', param='value')
Stream return Response(generator())

You Did It! 🎉

You now understand how Flask sends responses back to users! Remember:

  • Response Object = Your serving tray
  • Headers = Special notes on the tray
  • Status Codes = Kitchen’s signal (200=good, 404=not found)
  • jsonify = Speak JSON language
  • make_response = Build custom responses
  • redirect = Send users elsewhere
  • url_for = Smart URL building
  • Streaming = Send data piece by piece

You’re ready to serve data like a pro chef! 👨‍🍳

Loading story...

No Story Available

This concept doesn't have a story yet.

Story Preview

Story - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.

Interactive Preview

Interactive - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.

No Interactive Content

This concept doesn't have interactive content yet.

Cheatsheet Preview

Cheatsheet - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.

No Cheatsheet Available

This concept doesn't have a cheatsheet yet.

Quiz Preview

Quiz - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.

No Quiz Available

This concept doesn't have a quiz yet.