Flask Basics
9 examples to get you started with Flask 3.1 - 6 basic and 3 intermediate.
Prerequisites
uv pip install "flask>=3.1"
export FLASK_APP=app:create_app
flask run- Flask 3.1 on Python 3.14 uses Werkzeug 3.
Basic Examples
1. Minimal App
Hello world WSGI app.
from flask import Flask
app = Flask(__name__)
@app.get("/")
def home():
return {"message": "Hello"}Flask(__name__)sets package root.- Return dicts for JSON with Flask 3.
- Use
flask runin development.
Related: Building REST APIs - JSON patterns
2. Route Methods
Restrict HTTP verbs.
from flask import Flask
app = Flask(__name__)
@app.route("/items", methods=["GET", "POST"])
def items():
return {"ok": True}- methods list controls verbs.
- 405 when verb not allowed.
- Prefer
@app.get/@app.postshortcuts.
3. Query Args
Read query string parameters.
from flask import Flask, request
app = Flask(__name__)
@app.get("/search")
def search():
q = request.args.get("q", "")
return {"q": q}request.argsis immutable mapping.- Provide defaults for missing keys.
- Validate before passing to SQL.
4. JSON Body
Parse JSON POST bodies.
from flask import Flask, request
app = Flask(__name__)
@app.post("/items")
def create():
data = request.get_json(force=True)
return data, 201- Check Content-Type in production.
- Validate with Pydantic or marshmallow.
- Return tuple for status code.
5. URL Variables
Dynamic path segments.
from flask import Flask
app = Flask(__name__)
@app.get("/users/<int:user_id>")
def user(user_id: int):
return {"user_id": user_id}- Converters coerce types.
- Type hints document intent.
- 404 via
abort(404)when missing.
6. Error Handler
JSON errors.
from flask import Flask, abort
app = Flask(__name__)
@app.errorhandler(404)
def not_found(e):
return {"error": "not_found"}, 404- Register handlers per code.
- Keep payload shape stable.
- Log server-side details.
Related: Middleware patterns via hooks - lifecycle
Intermediate Examples
7. App Factory
Create app via factory function.
from flask import Flask
def create_app():
app = Flask(__name__)
app.config.from_mapping(DEBUG=True)
return app- Factories enable testing multiple configs.
- Register blueprints inside factory.
- Avoid module-level global app in libraries.
Related: Application Factories & Blueprints - blueprints
8. Blueprint
Modular routes.
from flask import Blueprint
bp = Blueprint("users", __name__, url_prefix="/users")
@bp.get("/")
def list_users():
return []- Blueprints group related routes.
- url_prefix shares path root.
- Register with
app.register_blueprint.
9. Test Client
In-process HTTP tests.
def test_home(client):
r = client.get("/")
assert r.status_code == 200- pytest fixture wraps
app.test_client(). - No network required.
- Set
TESTINGconfig flag.
Related: Testing Flask - fixtures
Stack versions: This page was written for Python 3.14.0 (stable 3.14, maintenance 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, and uv 0.6+.