Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/numberly/flask-stupe

:syringe: a.k.a. « Flask on steroids »
https://github.com/numberly/flask-stupe

flask flask-extensions json marshmallow mongodb pypy3 python python-library python3

Last synced: 9 days ago
JSON representation

:syringe: a.k.a. « Flask on steroids »

Awesome Lists containing this project

README

        

.. image:: https://raw.githubusercontent.com/numberly/flask-stupe/master/artwork/stupeflask.png
:target: https://youtu.be/PdaAHMztNVE

|

.. image:: https://img.shields.io/pypi/v/flask-stupe.svg
:target: https://pypi.python.org/pypi/Flask-Stupe
.. image:: https://img.shields.io/github/license/numberly/flask-stupe.svg
:target: https://github.com/numberly/flask-stupe/blob/master/LICENSE
.. image:: https://img.shields.io/travis/numberly/flask-stupe.svg
:target: https://travis-ci.org/numberly/flask-stupe
.. image:: https://img.shields.io/coveralls/numberly/flask-stupe.svg
:target: https://coveralls.io/github/numberly/flask-stupe
.. image:: https://readthedocs.org/projects/flask-stupe/badge
:target: http://flask-stupe.readthedocs.io

|

*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

Features
========

* Return any object type in views, and it will be coerced to a
:code:`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

Install
=======

.. code-block:: sh

$ pip install flask-stupe

Comparison
==========

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** |
+--------------------------------------------------------+-----------------------------------------------------+
|.. code-block:: python |.. code-block:: python |
| | |
| from bson import ObjectId | from flask import request |
| from flask import abort, Flask, jsonify, request | from flask_stupe import paginate, schema_required |
| from marshmallow import Schema | from flask_stupe.json import Stupeflask |
| from marshmallow.fields import String | from marshmallow import Schema |
| from pymongo import MongoClient | from marshmallow.fields import String |
| | from pymongo import MongoClient |
| app = Flask(__name__) | |
| users = MongoClient().database.users | app = Stupeflask(__name__) |
| | users = MongoClient().database.users |
| | |
| class UserSchema(Schema): | |
| username = String(required=True) | class UserSchema(Schema): |
| password = String() | username = String(required=True) |
| | password = String() |
| | |
| @app.route("/user", methods=["POST"]) | |
| def post_user(): | @app.route("/user", methods=["POST"]) |
| json = request.get_json(force=True) | @schema_required(UserSchema()) |
| validation_result = UserSchema().load(json) | def post_user(): |
| if validation_result.errors: | result = users.insert_one(request.schema) |
| abort(400, validation_result.errors) | request.schema.update(_id=result.inserted_id) |
| result = users.insert_one(validation_result.data) | return request.schema |
| inserted_id = str(result.inserted_id) | |
| validation_result.data.update(_id=inserted_id) | |
| return jsonify(validation_result.data) | @app.route("/user/") |
| | def get_user(id): |
| | return users.find_one({"_id": id}) |
| @app.route("/user/") | |
| def get_user(id): | |
| try: | @app.route("/users") |
| id = ObjectId(id) | @paginate(limit=100) |
| except ValueError: | def get_users(): |
| abort(404) | return users.find() |
| 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)) | |
+--------------------------------------------------------+-----------------------------------------------------+

Tests
=====

To run Flask-Stupe tests:

* install developers requirements with ``pip install -r requirements.txt``;
* run ``pytest``.

License
=======

MIT

.. _Flask: http://flask.pocoo.org/
.. _Marshmallow: https://marshmallow.readthedocs.io/en/latest/
.. _MongoDB: https://www.mongodb.com/