Skip to content

make_response changes breaks custom response class #2736

@jesseops

Description

@jesseops

Expected Behavior

I should be able to return a single value from my view(that is, not a tuple) and have my value passed to my custom response class. In this case I have a response class that detects whether JSON or pickle data was requested by the client and dumps the return value appropriately. This allows me to simply return a list or dict from my view without having to detect and dump the appropriate type.

@mod.route('/')
def return_json_or_pickle():
    return ['foo', 'bar', 'bat']

As of Flask 0.12.2 this worked - make_response would pass the list to my custom response class and my client would get what it wanted.

Actual Behavior

As of 1.0, commit #2256 was merged which added an explicit check to see if the return value was a list; treating a list as a tuple return in that case. I now get a typeerror:

TypeError: The view function did not return a valid response tuple. The tuple must have the form (body, status, headers), (body, status), or (body, headers).

If I change my view function to return a tuple:

@mod.route('/')
def return_json_or_pickle():
    return ['foo', 'bar', 'bat'], 200

the previous functionality is restored! This confirms that tuple handling is of course perfectly fine. I have a pull request prepared which should do a very nice job of resolving the issue - it simply omits list from the type check in make_response. Since a list is not a valid response anyway, there's no reason I can see for it to be there.

Environment

  • Python version: 3.6
  • Flask version: 1.0
  • Werkzeug version: n/a

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions