From d7fd4f322e47009e8562a7d492dd8378efa29b82 Mon Sep 17 00:00:00 2001 From: Rohan Salwan Date: Sun, 15 Aug 2021 13:41:51 +0530 Subject: [PATCH] fix issue 3396 --- CHANGES.rst | 3 ++- src/flask/testing.py | 18 ++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index eeba61ab..3efe4154 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -21,7 +21,8 @@ Unreleased :issue:`4096` - The CLI loader handles ``**kwargs`` in a ``create_app`` function. :issue:`4170` - +- Fix ``Unable to extend FlaskClient with follow_redirects`` issue. + :issue:`3396` Version 2.0.1 ------------- diff --git a/src/flask/testing.py b/src/flask/testing.py index fe3b846a..fc872136 100644 --- a/src/flask/testing.py +++ b/src/flask/testing.py @@ -108,6 +108,7 @@ class FlaskClient(Client): application: "Flask" preserve_context = False + ex_builder = None def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: super().__init__(*args, **kwargs) @@ -189,9 +190,9 @@ class FlaskClient(Client): "flask._preserve_context": self.preserve_context, } - if not kwargs and len(args) == 1: - arg = args[0] + arg = args[0] + if not kwargs and len(args) == 1: if isinstance(arg, werkzeug.test.EnvironBuilder): builder = copy(arg) builder.environ_base = copy_environ(builder.environ_base or {}) @@ -204,9 +205,18 @@ class FlaskClient(Client): request = copy(arg) request.environ = copy_environ(request.environ) + if isinstance(arg, werkzeug.test.EnvironBuilder): + builder = copy(arg) + builder.environ_base = copy_environ(builder.environ_base or {}) + request = builder.get_request() + if request is None: - kwargs["environ_base"] = copy_environ(kwargs.get("environ_base", {})) - builder = EnvironBuilder(self.application, *args, **kwargs) + if self.ex_builder is None: + kwargs["environ_base"] = copy_environ(kwargs.get("environ_base", {})) + builder = EnvironBuilder(self.application, *args, **kwargs) + self.ex_builder = builder + else: + builder = self.ex_builder try: request = builder.get_request()