mirror of
				https://github.com/django/django.git
				synced 2025-10-31 01:25:32 +00:00 
			
		
		
		
	Fixed #6353 (again) by making force_unicode() and smart_str() a bit more robust
in the face of funky Exception instances. This is slightly symptomatic of problems in the calling code, but we don't want to raise a secondary exception whilst trying to display the first one. Based on a patch from Karen Tracey. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8588 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		| @@ -48,7 +48,19 @@ def force_unicode(s, encoding='utf-8', strings_only=False, errors='strict'): | ||||
|             if hasattr(s, '__unicode__'): | ||||
|                 s = unicode(s) | ||||
|             else: | ||||
|                 s = unicode(str(s), encoding, errors) | ||||
|                 try: | ||||
|                     s = unicode(str(s), encoding, errors) | ||||
|                 except UnicodeEncodeError: | ||||
|                     if not isinstance(s, Exception): | ||||
|                         raise | ||||
|                     # If we get to here, the caller has passed in an Exception | ||||
|                     # subclass populated with non-ASCII data without special | ||||
|                     # handling to display as a string. We need to handle this | ||||
|                     # without raising a further exception. We do an | ||||
|                     # approximation to what the Exception's standard str() | ||||
|                     # output should be. | ||||
|                     s = ' '.join([force_unicode(arg, encoding, strings_only, | ||||
|                             errors) for arg in s]) | ||||
|         elif not isinstance(s, unicode): | ||||
|             # Note: We use .decode() here, instead of unicode(s, encoding, | ||||
|             # errors), so that if s is a SafeString, it ends up being a | ||||
| @@ -72,6 +84,12 @@ def smart_str(s, encoding='utf-8', strings_only=False, errors='strict'): | ||||
|         try: | ||||
|             return str(s) | ||||
|         except UnicodeEncodeError: | ||||
|             if isinstance(s, Exception): | ||||
|                 # An Exception subclass containing non-ASCII data that doesn't | ||||
|                 # know how to print itself properly. We shouldn't raise a | ||||
|                 # further exception. | ||||
|                 return ' '.join([smart_str(arg, encoding, strings_only, | ||||
|                         errors) for arg in s]) | ||||
|             return unicode(s).encode(encoding, errors) | ||||
|     elif isinstance(s, unicode): | ||||
|         return s.encode(encoding, errors) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user