AtomLearn
DashboardGoalsGraphAchievementsReviewSign In
DashboardFlaskRequest & Response
FlaskNot Started

Request & Response

Reading request data and building responses in Flask

0%

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 request proxy object and lets you build responses with helper functions.

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

Next in Flask

Blueprints

Continue

Unlocks