diff --git a/openapi_core/contrib/flask/decorators.py b/openapi_core/contrib/flask/decorators.py index 91066d85..81778ca2 100644 --- a/openapi_core/contrib/flask/decorators.py +++ b/openapi_core/contrib/flask/decorators.py @@ -6,6 +6,7 @@ from typing import Type from flask.globals import request +from flask.helpers import make_response from flask.wrappers import Request from flask.wrappers import Response @@ -74,7 +75,8 @@ def _handle_request_view( ) -> Response: request = self._get_request() request.openapi = request_result # type: ignore - return view(*args, **kwargs) + rv = view(*args, **kwargs) + return make_response(rv) def _handle_request_errors( self, request_result: RequestValidationResult diff --git a/tests/integration/contrib/flask/data/v3.0/flask_factory.yaml b/tests/integration/contrib/flask/data/v3.0/flask_factory.yaml index 3b674c7c..5d219ed3 100644 --- a/tests/integration/contrib/flask/data/v3.0/flask_factory.yaml +++ b/tests/integration/contrib/flask/data/v3.0/flask_factory.yaml @@ -15,10 +15,16 @@ paths: type: integer get: responses: + 404: + description: Return error. + content: + text/html: + schema: + type: string 200: description: Return the resource. content: - application/json: + application/json: schema: type: object required: diff --git a/tests/integration/contrib/flask/test_flask_decorator.py b/tests/integration/contrib/flask/test_flask_decorator.py index be6fb118..f9f3c80a 100644 --- a/tests/integration/contrib/flask/test_flask_decorator.py +++ b/tests/integration/contrib/flask/test_flask_decorator.py @@ -174,7 +174,7 @@ def test_endpoint_error(self, client): } assert result.json == expected_data - def test_valid(self, client): + def test_valid_response_object(self, client): def view_response_callable(*args, **kwargs): from flask.globals import request @@ -197,3 +197,47 @@ def view_response_callable(*args, **kwargs): assert result.json == { "data": "data", } + + def test_valid_tuple_str(self, client): + def view_response_callable(*args, **kwargs): + from flask.globals import request + + assert request.openapi + assert not request.openapi.errors + assert request.openapi.parameters == Parameters( + path={ + "id": 12, + } + ) + return ("Not found", 404) + + self.view_response_callable = view_response_callable + + result = client.get("/browse/12/") + + assert result.status_code == 404 + assert result.text == "Not found" + + def test_valid_tuple_dict(self, client): + def view_response_callable(*args, **kwargs): + from flask.globals import request + + assert request.openapi + assert not request.openapi.errors + assert request.openapi.parameters == Parameters( + path={ + "id": 12, + } + ) + body = dict(data="data") + headers = {"X-Rate-Limit": "12"} + return (body, headers) + + self.view_response_callable = view_response_callable + + result = client.get("/browse/12/") + + assert result.status_code == 200 + assert result.json == { + "data": "data", + }