flask에서 지원하는 jsonify 함수도 괜찮지만
API성격상 대량의 데이터가 생성되는 모든 controller에서 응답을 즉시적으로
생성하는 것은 비 효율 적이기때문에
응답 클래스(marshmallow)를 생성해놓고 json으로 변환해주는 데코레이터를 만들어 놓으면 편리하다.
- 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
- 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