Skip to content

Instantly share code, notes, and snippets.

@nidkil
Created January 6, 2017 01:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nidkil/e1e9cc41b5143320f90672a735e37634 to your computer and use it in GitHub Desktop.
Save nidkil/e1e9cc41b5143320f90672a735e37634 to your computer and use it in GitHub Desktop.
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 AuthorCollection(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 AuthorDetail(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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment