|
5 | 5 | from typing import Any, Dict, Iterable |
6 | 6 |
|
7 | 7 | from django.core.serializers.json import DjangoJSONEncoder |
| 8 | +from django.utils.encoding import force_str |
8 | 9 | from django.utils.module_loading import import_string |
9 | 10 |
|
10 | 11 | from debug_toolbar import settings as dt_settings |
11 | 12 |
|
12 | 13 | logger = logging.getLogger(__name__) |
13 | 14 |
|
14 | 15 |
|
| 16 | +class DebugToolbarJSONEncoder(DjangoJSONEncoder): |
| 17 | + def default(self, o): |
| 18 | + try: |
| 19 | + return super().default(o) |
| 20 | + except (TypeError, ValueError): |
| 21 | + logger.debug("The debug toolbar can't serialize %s into JSON" % o) |
| 22 | + return force_str(o) |
| 23 | + |
| 24 | + |
15 | 25 | def serialize(data: Any) -> str: |
16 | 26 | # If this starts throwing an exceptions, consider |
17 | 27 | # Subclassing DjangoJSONEncoder and using force_str to |
18 | 28 | # make it JSON serializable. |
19 | | - return json.dumps(data, cls=DjangoJSONEncoder) |
| 29 | + return json.dumps(data, cls=DebugToolbarJSONEncoder) |
20 | 30 |
|
21 | 31 |
|
22 | 32 | def deserialize(data: str) -> Any: |
@@ -106,14 +116,7 @@ def delete(cls, request_id: str): |
106 | 116 | def save_panel(cls, request_id: str, panel_id: str, data: Any = None): |
107 | 117 | """Save the panel data for the given request_id""" |
108 | 118 | cls.set(request_id) |
109 | | - try: |
110 | | - cls._request_store[request_id][panel_id] = serialize(data) |
111 | | - except TypeError: |
112 | | - if dt_settings.get_config()["SUPPRESS_SERIALIZATION_ERRORS"]: |
113 | | - log = "Panel (%s) failed to serialized data %s properly." |
114 | | - logger.warning(log % (panel_id, data)) |
115 | | - else: |
116 | | - raise |
| 119 | + cls._request_store[request_id][panel_id] = serialize(data) |
117 | 120 |
|
118 | 121 | @classmethod |
119 | 122 | def panel(cls, request_id: str, panel_id: str) -> Any: |
|
0 commit comments