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-stupe
Here 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 requirements.txt
; - run
pytest
.
MIT