From: Sebastián Ramírez Date: Sat, 29 Aug 2020 12:21:00 +0000 (+0200) Subject: 🐛 Fix issues introduced by removing sqlalchemy safeguard in jsonable_encoder (#1987) X-Git-Tag: 0.61.1~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0dfde6e284b221bf6695a98762a56d13a995e807;p=thirdparty%2Ffastapi%2Ffastapi.git 🐛 Fix issues introduced by removing sqlalchemy safeguard in jsonable_encoder (#1987) --- diff --git a/fastapi/encoders.py b/fastapi/encoders.py index 1c324b9156..1255b74977 100644 --- a/fastapi/encoders.py +++ b/fastapi/encoders.py @@ -32,6 +32,7 @@ def jsonable_encoder( exclude_defaults: bool = False, exclude_none: bool = False, custom_encoder: dict = {}, + sqlalchemy_safe: bool = True, ) -> Any: if include is not None and not isinstance(include, set): include = set(include) @@ -56,6 +57,7 @@ def jsonable_encoder( exclude_none=exclude_none, exclude_defaults=exclude_defaults, custom_encoder=encoder, + sqlalchemy_safe=sqlalchemy_safe, ) if isinstance(obj, Enum): return obj.value @@ -66,8 +68,14 @@ def jsonable_encoder( if isinstance(obj, dict): encoded_dict = {} for key, value in obj.items(): - if (value is not None or not exclude_none) and ( - (include and key in include) or not exclude or key not in exclude + if ( + ( + not sqlalchemy_safe + or (not isinstance(key, str)) + or (not key.startswith("_sa")) + ) + and (value is not None or not exclude_none) + and ((include and key in include) or not exclude or key not in exclude) ): encoded_key = jsonable_encoder( key, @@ -75,6 +83,7 @@ def jsonable_encoder( exclude_unset=exclude_unset, exclude_none=exclude_none, custom_encoder=custom_encoder, + sqlalchemy_safe=sqlalchemy_safe, ) encoded_value = jsonable_encoder( value, @@ -82,6 +91,7 @@ def jsonable_encoder( exclude_unset=exclude_unset, exclude_none=exclude_none, custom_encoder=custom_encoder, + sqlalchemy_safe=sqlalchemy_safe, ) encoded_dict[encoded_key] = encoded_value return encoded_dict @@ -98,6 +108,7 @@ def jsonable_encoder( exclude_defaults=exclude_defaults, exclude_none=exclude_none, custom_encoder=custom_encoder, + sqlalchemy_safe=sqlalchemy_safe, ) ) return encoded_list @@ -133,4 +144,5 @@ def jsonable_encoder( exclude_defaults=exclude_defaults, exclude_none=exclude_none, custom_encoder=custom_encoder, + sqlalchemy_safe=sqlalchemy_safe, )