Skip to content

Instantly share code, notes, and snippets.

@leejaycoke
Last active March 29, 2016 01:19
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 leejaycoke/471df02cd1e0565f35dc to your computer and use it in GitHub Desktop.
Save leejaycoke/471df02cd1e0565f35dc to your computer and use it in GitHub Desktop.
Flask json response with marshmallow

flask에서 지원하는 jsonify 함수도 괜찮지만

API성격상 대량의 데이터가 생성되는 모든 controller에서 응답을 즉시적으로

생성하는 것은 비 효율 적이기때문에

응답 클래스(marshmallow)를 생성해놓고 json으로 변환해주는 데코레이터를 만들어 놓으면 편리하다.

Code

  • response class
from marshmallow import Schema
from marshmallow import fields

class User(Schema):

    id = fields.Integer()
    nickname = fields.String()
  • decorator to json response
from functools import wraps
from flask import jsonify

from marshmallow import Schema
from marshmallow.schema import SchemaMeta

def json_response(serializer=dict):
    def decorator(func):
        @wraps(func)
        def func_wrapper(*args, **kwargs):
            data = func(*args, **kwargs)

            if not data:
                return jsonify({})

            if isinstance(serializer, SchemaMeta):
                result = serializer().dump(data)
                return jsonify(result.data)

            if isinstance(serializer, Schema):
                result = serializer.dump(data)
                return jsonify(result.data)

            if isinstance(data, dict):
                return jsonify(data)

            return data

        return func_wrapper
    return decorator

Examples

  • SQLAlchemy model type
from any.path import UserResponse

@app.route('/user/<int:user_id>', methods=['GET'])
@json_response(UserResponse)
def user_get(user_id):
    user = get_user(user_id) // user is sqlalchemy model.
    return user
  • dic type
from any.path import UserResponse

@app.route('/user/<int:user_id>', methods=['GET'])
@json_response()
def user_get(user_id):
    user = {'user_id': 1, 'name': 'leejay'}
    return user
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment