Skip to content

Commit

Permalink
Fix returning tuple subclass from a view function
Browse files Browse the repository at this point in the history
  • Loading branch information
lafrech committed Apr 16, 2019
1 parent 3aced34 commit 498e041
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 2 deletions.
6 changes: 4 additions & 2 deletions flask_rest_api/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,16 @@ def load_info_from_docstring(docstring):
return info


# Copied from flask
# Copied from Flask
def unpack_tuple_response(rv):
"""Unpack a flask Response tuple"""

status = headers = None

# unpack tuple returns
if isinstance(rv, tuple):
# Unlike Flask, we check exact type because tuple subclasses may be
# returned by view functions and paginated/dumped
if type(rv) is tuple: # pylint: disable=unidiomatic-typecheck
len_rv = len(rv)

# a 3-tuple is unpacked directly
Expand Down
21 changes: 21 additions & 0 deletions tests/test_blueprint.py
Original file line number Diff line number Diff line change
Expand Up @@ -566,6 +566,13 @@ def func_response_code_str_headers():
def func_response_wrong_tuple():
return {}, 201, {'X-header': 'test'}, 'extra'

@blp.route('/response_tuple_subclass')
@blp.response()
def func_response_tuple_subclass():
class MyTuple(tuple):
pass
return MyTuple((1, 2))

api.register_blueprint(blp)

response = client.get('/test/response')
Expand Down Expand Up @@ -595,6 +602,9 @@ def func_response_wrong_tuple():
assert response.headers['X-header'] == 'test'
response = client.get('/test/response_wrong_tuple')
assert response.status_code == 500
response = client.get('/test/response_tuple_subclass')
assert response.status_code == 200
assert response.json == [1, 2]

def test_blueprint_pagination_response_tuple(self, app):
api = Api(app)
Expand Down Expand Up @@ -631,6 +641,14 @@ def func_response_code_headers():
def func_response_wrong_tuple():
return [1, 2], 201, {'X-header': 'test'}, 'extra'

@blp.route('/response_tuple_subclass')
@blp.response()
@blp.paginate(Page)
def func_response_tuple_subclass():
class MyTuple(tuple):
pass
return MyTuple((1, 2))

api.register_blueprint(blp)

response = client.get('/test/response')
Expand All @@ -649,6 +667,9 @@ def func_response_wrong_tuple():
assert response.headers['X-header'] == 'test'
response = client.get('/test/response_wrong_tuple')
assert response.status_code == 500
response = client.get('/test/response_tuple_subclass')
assert response.status_code == 200
assert response.json == [1, 2]

def test_blueprint_response_response_object(self, app, schemas):
api = Api(app)
Expand Down

0 comments on commit 498e041

Please sign in to comment.