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)