AtomLearnAtomLearn
DashboardGoalsPathAchievementsReviewSign In
DashboardFlaskRequest & Response
FlaskNot Started

Request & Response

Reading request data and building responses in Flask

0%
Knowledge0%
Learn & Drill
Fluency0%
Drill & Speed
Retention0%
Mastery & Review
Confidence0%
All modes
Practice
Knowledge
Fluency
Retention

Knowledge Debt detected

You can study this freely — but your score may plateau if these foundations have gaps. The Mastery badge requires them to be solid.

Explanation

Flask exposes the current request through the and lets you build responses with helper functions like .

Reading request data:

python from flask import Flask, request, jsonify app = Flask(__name__) @app.route("/users", methods=["POST"]) def create_user(): # JSON body data = request.get_json() # dict or None name = data.get("name") email = data.get("email") # Query parameters: /users?page=2&limit=10 page = request.args.get("page", 1, type=int) limit = request.args.get("limit", 10, type=int) # Form data (Content-Type: multipart/form-data) name = request.form.get("name") # Headers token = request.headers.get("Authorization") # Route parameters are passed as function arguments return jsonify({"ok": True}), 201

Building responses:

python from flask import jsonify, make_response # jsonify — sets Content-Type: application/json return jsonify({"id": 1, "name": "Alice"}), 200 # Custom headers response = make_response(jsonify({"ok": True}), 201) response.headers["X-Request-ID"] = "abc123" return response # Empty 204 return "", 204

Validation pattern:

python @app.route("/users", methods=["POST"]) def create_user(): data = request.get_json(silent=True) if not data: return jsonify({"error": "JSON body required"}), 400 if not data.get("email"): return jsonify({"error": "email is required"}), 422 # ... process return jsonify({"id": new_id}), 201

Examples

Paginated list endpoint

Read query params with type coercion and build a paginated response

from flask import Flask, request, jsonify

app = Flask(__name__)

USERS = [{"id": i, "name": f"User {i}"} for i in range(1, 101)]

@app.route("/users")
def list_users():
    page  = request.args.get("page",  1,  type=int)
    limit = request.args.get("limit", 10, type=int)

    if page < 1 or limit < 1 or limit > 100:
        return jsonify({"error": "Invalid pagination params"}), 400

    start = (page - 1) * limit
    end   = start + limit
    items = USERS[start:end]

    return jsonify({
        "data":  items,
        "page":  page,
        "limit": limit,
        "total": len(USERS),
    })

File upload handling

File uploads via request.files — always secure_filename to prevent path traversal

import os
from flask import Flask, request, jsonify
from werkzeug.utils import secure_filename

app = Flask(__name__)
app.config["UPLOAD_FOLDER"] = "/tmp/uploads"
ALLOWED = {"png", "jpg", "pdf"}

@app.route("/upload", methods=["POST"])
def upload():
    if "file" not in request.files:
        return jsonify({"error": "No file"}), 400

    f = request.files["file"]
    if not f.filename:
        return jsonify({"error": "Empty filename"}), 400

    ext = f.filename.rsplit(".", 1)[-1].lower()
    if ext not in ALLOWED:
        return jsonify({"error": f"Extension .{ext} not allowed"}), 415

    filename = secure_filename(f.filename)
    f.save(os.path.join(app.config["UPLOAD_FOLDER"], filename))
    return jsonify({"filename": filename}), 201

How well did you understand this?

Next in Flask

Blueprints

Continue

Unlocks