 
a.k.a. « Flask on steroids »
An opinionated Flask extension designed by and for web developers to reduce boilerplate code when working with Marshmallow, MongoDB and/or JSON.
Documentation: https://flask-stupe.readthedocs.io
- Return any object type in views, and it will be coerced to a
flask.Response
- Validate payloads through Marshmallow schemas
- Easily add JSON converters for any custom type
- Fetch all the blueprints from a whole module in one line
- Native ObjectId support for both Flask and Marshmallow
- Powerful configuration management
- Decorators to handle authentication, permissions, and pagination
- 100% coverage and no dependency
$ pip install flask-stupeHere is a comparison of a bare Flask application and its equivalent Stupeflask version. They both rely on MongoDB, handle input and output in JSON, and allow to create a user and retrieve one or more.
| Bare Flask | With Stupeflask | 
| from bson import ObjectId
from flask import abort, Flask, jsonify, request
from marshmallow import Schema
from marshmallow.fields import String
from pymongo import MongoClient
app = Flask(__name__)
users = MongoClient().database.users
class UserSchema(Schema):
    username = String(required=True)
    password = String()
@app.route("/user", methods=["POST"])
def post_user():
    json = request.get_json(force=True)
    validation_result = UserSchema().load(json)
    if validation_result.errors:
        abort(400, validation_result.errors)
    result = users.insert_one(validation_result.data)
    inserted_id = str(result.inserted_id)
    validation_result.data.update(_id=inserted_id)
    return jsonify(validation_result.data)
@app.route("/user/<id>")
def get_user(id):
    try:
        id = ObjectId(id)
    except ValueError:
        abort(404)
    user = users.find_one({"_id": id})
    user["_id"] = str(user["_id"])
    return jsonify(user)
@app.route("/users")
def get_users():
    limit = request.args.get("limit", 100, type=int)
    skip = request.args.get("skip", 0, type=int)
    cursor = users.find().limit(limit).skip(skip)
    return jsonify(list(cursor)) | from flask import request
from flask_stupe import paginate, schema_required
from flask_stupe.json import Stupeflask
from marshmallow import Schema
from marshmallow.fields import String
from pymongo import MongoClient
app = Stupeflask(__name__)
users = MongoClient().database.users
class UserSchema(Schema):
    username = String(required=True)
    password = String()
@app.route("/user", methods=["POST"])
@schema_required(UserSchema())
def post_user():
    result = users.insert_one(request.schema)
    request.schema.update(_id=result.inserted_id)
    return request.schema
@app.route("/user/<ObjectId:id>")
def get_user(id):
    return users.find_one({"_id": id})
@app.route("/users")
@paginate(limit=100)
def get_users():
    return users.find() | 
To run Flask-Stupe tests:
- install developers requirements with pip install -r dev-requirements.txt;
- run pytest.
MIT