Skip to content

Commit 39f5079

Browse files
Add support for Flask 2.0 (#2439) (#2473)
* Add support for Flask 2.0 * update riot flask versions * use ~=1.1.0 again * Update ddtrace/contrib/flask/patch.py Co-authored-by: Kyle Verhoog <[email protected]> * limit werkeug for flask-cache * add release note * Update riotfile.py Co-authored-by: Nicolas Vivet <[email protected]> Co-authored-by: Kyle Verhoog <[email protected]> Co-authored-by: Nicolas Vivet <[email protected]> (cherry picked from commit 4ac313b) Co-authored-by: Brett Langdon <[email protected]>
1 parent 3956b6f commit 39f5079

File tree

6 files changed

+67
-26
lines changed

6 files changed

+67
-26
lines changed

ddtrace/contrib/flask/patch.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,10 @@ def patch():
7474
_w("flask", "Flask.preprocess_request", request_tracer("preprocess_request"))
7575
_w("flask", "Flask.add_url_rule", traced_add_url_rule)
7676
_w("flask", "Flask.endpoint", traced_endpoint)
77-
_w("flask", "Flask._register_error_handler", traced_register_error_handler)
77+
if flask_version >= (2, 0, 0):
78+
_w("flask", "Flask.register_error_handler", traced_register_error_handler)
79+
else:
80+
_w("flask", "Flask._register_error_handler", traced__register_error_handler)
7881

7982
# flask.blueprints.Blueprint methods that have custom tracing (add metadata, wrap functions, etc)
8083
_w("flask", "Blueprint.register", traced_blueprint_register)
@@ -175,7 +178,6 @@ def unpatch():
175178
"Flask.dispatch_request",
176179
"Flask.add_url_rule",
177180
"Flask.endpoint",
178-
"Flask._register_error_handler",
179181
"Flask.preprocess_request",
180182
"Flask.process_response",
181183
"Flask.handle_exception",
@@ -218,6 +220,11 @@ def unpatch():
218220
"templating._render",
219221
]
220222

223+
if flask_version >= (2, 0, 0):
224+
props.append("Flask.register_error_handler")
225+
else:
226+
props.append("Flask._register_error_handler")
227+
221228
# These were added in 0.11.0
222229
if flask_version >= (0, 11):
223230
props.append("before_render_template.receivers_for")
@@ -429,15 +436,24 @@ def _wrap(template, context, app):
429436
return _wrap(*args, **kwargs)
430437

431438

432-
def traced_register_error_handler(wrapped, instance, args, kwargs):
433-
"""Wrapper to trace all functions registered with flask.app.register_error_handler"""
439+
def traced__register_error_handler(wrapped, instance, args, kwargs):
440+
"""Wrapper to trace all functions registered with flask.app._register_error_handler"""
434441

435442
def _wrap(key, code_or_exception, f):
436443
return wrapped(key, code_or_exception, wrap_function(instance, f))
437444

438445
return _wrap(*args, **kwargs)
439446

440447

448+
def traced_register_error_handler(wrapped, instance, args, kwargs):
449+
"""Wrapper to trace all functions registered with flask.app.register_error_handler"""
450+
451+
def _wrap(code_or_exception, f):
452+
return wrapped(code_or_exception, wrap_function(instance, f))
453+
454+
return _wrap(*args, **kwargs)
455+
456+
441457
def request_tracer(name):
442458
@with_instance_pin
443459
def _traced_request(pin, wrapped, instance, args, kwargs):
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
features:
3+
- |
4+
Add support for Flask 2

riotfile.py

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -585,13 +585,12 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
585585
"blinker": latest,
586586
},
587587
venvs=[
588-
# Flask 0.10, 0.11
588+
# Flask == 0.12.0
589589
Venv(
590590
pys=select_pys(),
591591
pkgs={
592-
"flask": ["~=0.10.0", "~=0.11.0"],
592+
"flask": ["~=0.12.0"],
593593
"pytest": "~=3.0",
594-
"Werkzeug": "<1.0",
595594
},
596595
),
597596
Venv(
@@ -602,17 +601,19 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
602601
"DATADOG_PATCH_MODULES": "jinja2:false",
603602
},
604603
pkgs={
605-
"flask": ["~=0.10.0", "~=0.11.0"],
604+
"flask": ["~=0.12.0"],
606605
"pytest": "~=3.0",
607-
"Werkzeug": "<1.0",
608606
},
609607
),
610-
# Flask == 0.12.0
608+
# Flask 1.x.x
611609
Venv(
612610
pys=select_pys(),
613611
pkgs={
614-
"flask": ["~=0.12.0"],
615-
"pytest": "~=3.0",
612+
"flask": [
613+
"~=1.0.0",
614+
"~=1.1.0",
615+
"~=1.0", # latest 1.x
616+
],
616617
},
617618
),
618619
Venv(
@@ -623,26 +624,37 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
623624
"DATADOG_PATCH_MODULES": "jinja2:false",
624625
},
625626
pkgs={
626-
"flask": ["~=0.12.0"],
627-
"pytest": "~=3.0",
627+
"flask": [
628+
"~=1.0.0",
629+
"~=1.1.0",
630+
"~=1.0", # latest 1.x
631+
],
628632
},
629633
),
630-
# Flask >= 1.0.0
634+
# Flask >= 2.0.0
631635
Venv(
632-
pys=select_pys(),
636+
pys=select_pys(min_version="3.6"),
633637
pkgs={
634-
"flask": ["~=1.0.0", "~=1.1.0", "<2.0.0"],
638+
"flask": [
639+
"~=2.0.0",
640+
"~=2.0", # latest 2.x
641+
latest,
642+
],
635643
},
636644
),
637645
Venv(
638-
pys=select_pys(),
646+
pys=select_pys(min_version="3.6"),
639647
command="python tests/ddtrace_run.py pytest {cmdargs} tests/contrib/flask_autopatch",
640648
env={
641649
"DATADOG_SERVICE_NAME": "test.flask.service",
642650
"DATADOG_PATCH_MODULES": "jinja2:false",
643651
},
644652
pkgs={
645-
"flask": ["~=1.0.0", "~=1.1.0", "<2.0.0"],
653+
"flask": [
654+
"~=2.0.0",
655+
"~=2.0", # latest 2.x
656+
latest,
657+
],
646658
},
647659
),
648660
],
@@ -654,6 +666,7 @@ def select_pys(min_version=MIN_PYTHON_VERSION, max_version=MAX_PYTHON_VERSION):
654666
"python-memcached": latest,
655667
"redis": "~=2.0",
656668
"blinker": latest,
669+
"werkzeug": "<1.0",
657670
},
658671
venvs=[
659672
Venv(

tests/contrib/flask/__init__.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@ def setUp(self):
1818
Pin.override(self.app, tracer=self.tracer)
1919

2020
def tearDown(self):
21-
# Remove any remaining spans
22-
self.tracer.pop()
23-
21+
super(BaseFlaskTestCase, self).tearDown()
2422
# Unpatch Flask
2523
unpatch()
2624

tests/contrib/flask/test_flask_helpers.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
from io import BytesIO
2+
13
import flask
24

35
from ddtrace import Pin
6+
from ddtrace.compat import StringIO
47
from ddtrace.contrib.flask import unpatch
5-
from ddtrace.internal.compat import StringIO
8+
from ddtrace.contrib.flask.patch import flask_version
69

710
from . import BaseFlaskTestCase
811

@@ -78,7 +81,10 @@ def test_send_file(self):
7881
When calling a patched ``flask.send_file``
7982
We create the expected spans
8083
"""
81-
fp = StringIO("static file")
84+
if flask_version >= (2, 0, 0):
85+
fp = BytesIO(b"static file")
86+
else:
87+
fp = StringIO("static file")
8288

8389
with self.app.app_context():
8490
with self.app.test_request_context("/"):
@@ -110,7 +116,11 @@ def test_send_file_pin_disabled(self):
110116
pin = Pin.get_from(self.app)
111117
pin.tracer.enabled = False
112118

113-
fp = StringIO("static file")
119+
if flask_version >= (2, 0, 0):
120+
fp = BytesIO(b"static file")
121+
else:
122+
fp = StringIO("static file")
123+
114124
with self.app.app_context():
115125
with self.app.test_request_context("/"):
116126
# DEV: Flask >= (0, 12, 0) tries to infer mimetype, so set explicitly

tests/contrib/flask/test_hooks.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def setUp(self):
1414
def index():
1515
return "Hello Flask", 200
1616

17-
self.bp = Blueprint(__name__, "bp")
17+
self.bp = Blueprint("bp", __name__)
1818

1919
@self.bp.route("/bp")
2020
def bp():

0 commit comments

Comments
 (0)