I needed to quickly test a few things today using Flask, Flask-Restplus and Flask-Marshmallow. I created the following boilerplate code that can easily be modified for further quick tests.
from flask import Flask, Blueprint, url_for, jsonify
from flask_restplus import Api, Resource
from flask_marshmallow import Marshmallow, base_fields
from marshmallow import post_dump
# Setup Flask app
url_prefix = '/api/v4'
doc = '/apidoc/'
app = Flask(__name__)
app.config['JSON_SORT_KEYS'] = False
ma = Marshmallow()
blueprint = Blueprint('api', __name__, url_prefix=url_prefix)
api = Api(blueprint, doc=doc, version='3.0')
# Models
class Bunch(dict):
def __init__(self, *args, **kwargs):
super(Bunch, self).__init__(*args, **kwargs)
self.__dict__ = self
class Author(Bunch):
pass
def mock_author():
author = Author(id=123, name='Fred Douglass')
return author
def mock_author_list():
a1 = Author(id=1, name="Alice")
a2 = Author(id=2, name="Bob")
a3 = Author(id=3, name="Carol")
return [a1, a2, a3]
# Schemas
class AuthorSchema(ma.Schema):
id = base_fields.Int(dump_only=True)
absolute_url = ma.AbsoluteURLFor('api.author', id='<id>')
links = ma.Hyperlinks({
'self': ma.URLFor('api.author', id='<id>'),
'collection': ma.URLFor('api.authors')
})
@post_dump(pass_many=True)
def wrap(self, data, many):
key = 'authors' if many else 'author'
return {
key: data
}
class Meta:
fields = ('id', 'name', 'links', 'absolute_url')
ordered = True
# Setup operations
ns = api.namespace('authors', description='desc')
ep_1 = 'authors'
ep_2 = 'author'
@ns.route('/', endpoint=ep_1)
class AuthorsCollection(Resource):
def get(self):
print " ---- GET - result=" + url_for('api.' + ep_1)
s = AuthorSchema(many=True)
result = s.dump(mock_author_list())
return jsonify(result.data)
def post(self):
print " ---- POST - result=" + url_for('api.' + ep_1)
return None, 201
@ns.route('/<int:id>', endpoint=ep_2)
class AuthorsDetail(Resource):
def get(self, id):
print " ---- GET - result=" + url_for('api.' + ep_2, id=id)
print " ---- GET - result=" + url_for('api.' + ep_1)
s = AuthorSchema()
result = s.dump(mock_author())
return jsonify(result.data)
def put(self, id):
print " ---- PUT - result=" + url_for('api.' + ep_2, id=id)
print " ---- PUT - result=" + url_for('api.' + ep_1)
return None, 204
def delete(self, id):
print " ---- DELETE - result=" + url_for('api.' + ep_2, id=id)
print " ---- DELETE - result=" + url_for('api.' + ep_1)
return None, 204
app.register_blueprint(blueprint)
if __name__ == '__main__':
print '>>>>> Starting server at http://localhost:8080{url_prefix}{doc}'.\
format(url_prefix=url_prefix, doc=doc)
app.run(port=8080, debug=True)