Chapter 5 of 10
Flask's request and response objects give you full access to everything in an HTTP request and full control over the response.
from flask import request, jsonify
@app.route("/api/courses", methods=["GET"])
def get_courses():
# Query parameters: /api/courses?level=beginner&limit=10
level = request.args.get("level")
limit = request.args.get("limit", 20, type=int)
courses = Course.query.filter_by(level=level).limit(limit).all()
return jsonify([c.to_dict() for c in courses])
@app.route("/api/courses", methods=["POST"])
def create_course():
# JSON body
data = request.get_json()
if not data or "title" not in data:
return jsonify({"error": "title required"}), 400
# Form data (from HTML forms)
name = request.form.get("name")
email = request.form.get("email")
# Request metadata
request.method # "POST"
request.url # full URL
request.headers # all headers
request.remote_addr # client IPfrom flask import jsonify, make_response, redirect, url_for
# JSON response (most common for APIs)
return jsonify({"courses": courses_list})
# With status code
return jsonify({"error": "Not found"}), 404
return jsonify({"id": new_id}), 201
# Custom response with headers
response = make_response(jsonify(data))
response.headers["X-Request-Id"] = request_id
response.status_code = 200
return response
# Redirect
return redirect(url_for("index"))
return redirect("https://nelsonlabs.dev", 301)
# Flash messages (shown in templates)
from flask import flash
flash("Course created successfully!", "success")
flash("Invalid email address", "error")