Merge pull request #1079 from smarkets/master
Get rid of _tag->closure->_tag reference cycle
This commit is contained in:
commit
7cfe833a50
1 changed files with 26 additions and 24 deletions
|
|
@ -52,36 +52,38 @@ class SessionMixin(object):
|
||||||
modified = True
|
modified = True
|
||||||
|
|
||||||
|
|
||||||
|
def _tag(value):
|
||||||
|
if isinstance(value, tuple):
|
||||||
|
return {' t': [_tag(x) for x in value]}
|
||||||
|
elif isinstance(value, uuid.UUID):
|
||||||
|
return {' u': value.hex}
|
||||||
|
elif isinstance(value, bytes):
|
||||||
|
return {' b': b64encode(value).decode('ascii')}
|
||||||
|
elif callable(getattr(value, '__html__', None)):
|
||||||
|
return {' m': text_type(value.__html__())}
|
||||||
|
elif isinstance(value, list):
|
||||||
|
return [_tag(x) for x in value]
|
||||||
|
elif isinstance(value, datetime):
|
||||||
|
return {' d': http_date(value)}
|
||||||
|
elif isinstance(value, dict):
|
||||||
|
return dict((k, _tag(v)) for k, v in iteritems(value))
|
||||||
|
elif isinstance(value, str):
|
||||||
|
try:
|
||||||
|
return text_type(value)
|
||||||
|
except UnicodeError:
|
||||||
|
raise UnexpectedUnicodeError(u'A byte string with '
|
||||||
|
u'non-ASCII data was passed to the session system '
|
||||||
|
u'which can only store unicode strings. Consider '
|
||||||
|
u'base64 encoding your string (String was %r)' % value)
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
class TaggedJSONSerializer(object):
|
class TaggedJSONSerializer(object):
|
||||||
"""A customized JSON serializer that supports a few extra types that
|
"""A customized JSON serializer that supports a few extra types that
|
||||||
we take for granted when serializing (tuples, markup objects, datetime).
|
we take for granted when serializing (tuples, markup objects, datetime).
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def dumps(self, value):
|
def dumps(self, value):
|
||||||
def _tag(value):
|
|
||||||
if isinstance(value, tuple):
|
|
||||||
return {' t': [_tag(x) for x in value]}
|
|
||||||
elif isinstance(value, uuid.UUID):
|
|
||||||
return {' u': value.hex}
|
|
||||||
elif isinstance(value, bytes):
|
|
||||||
return {' b': b64encode(value).decode('ascii')}
|
|
||||||
elif callable(getattr(value, '__html__', None)):
|
|
||||||
return {' m': text_type(value.__html__())}
|
|
||||||
elif isinstance(value, list):
|
|
||||||
return [_tag(x) for x in value]
|
|
||||||
elif isinstance(value, datetime):
|
|
||||||
return {' d': http_date(value)}
|
|
||||||
elif isinstance(value, dict):
|
|
||||||
return dict((k, _tag(v)) for k, v in iteritems(value))
|
|
||||||
elif isinstance(value, str):
|
|
||||||
try:
|
|
||||||
return text_type(value)
|
|
||||||
except UnicodeError:
|
|
||||||
raise UnexpectedUnicodeError(u'A byte string with '
|
|
||||||
u'non-ASCII data was passed to the session system '
|
|
||||||
u'which can only store unicode strings. Consider '
|
|
||||||
u'base64 encoding your string (String was %r)' % value)
|
|
||||||
return value
|
|
||||||
return json.dumps(_tag(value), separators=(',', ':'))
|
return json.dumps(_tag(value), separators=(',', ':'))
|
||||||
|
|
||||||
def loads(self, value):
|
def loads(self, value):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue