Request & Response
Reading request data and building responses in Flask
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}), 201Next in Flask
Blueprints