Skip to content
Browse files

Added yaml directly into BUILTIN_SERIALIZERS.

The serializer definitely exists, but the dependent yaml module may not
be installed.  The register_serializer() function will catch exceptions
and will stub in a fake serializer object that will raise the exception
when the serializer is used.
  • Loading branch information...
rca committed Sep 6, 2013
1 parent d8d61d8 commit c72392dab4b4cf6f5d9b35a3dcb582fbfe38ebb8
Showing with 32 additions and 8 deletions.
  1. +32 −8 django/core/serializers/
@@ -17,6 +17,7 @@

import importlib
import sys

from django.conf import settings
from django.utils import six
@@ -27,17 +28,29 @@
"xml" : "django.core.serializers.xml_serializer",
"python" : "django.core.serializers.python",
"json" : "django.core.serializers.json",
"yaml" : "django.core.serializers.pyyaml",

# Check for PyYaml and register the serializer if it's available.
import yaml
BUILTIN_SERIALIZERS["yaml"] = "django.core.serializers.pyyaml"
except ImportError:

_serializers = {}

class BadSerializer(object):
Stub serializer to hold exception raised during registration
This allows the serializer registration to cache serializers and if there
is an error raised in the process of creating a serializer it will be
raised and passed along to the caller when the serializer is used.
internal_use_only = False

def __init__(self, exception):
self.exception = exception

def __call__(self, *args, **kwargs):
raise self.exception

def register_serializer(format, serializer_module, serializers=None):
"""Register a new serializer.
@@ -53,12 +66,23 @@ def register_serializer(format, serializer_module, serializers=None):
if serializers is None and not _serializers:
module = importlib.import_module(serializer_module)

module = importlib.import_module(serializer_module)
except ImportError, exc:
bad_serializer = BadSerializer(exc)

module = type('BadSerializerModule', (object,), {
'Deserializer': bad_serializer,
'Serializer': bad_serializer,

if serializers is None:
_serializers[format] = module
serializers[format] = module

def unregister_serializer(format):
"Unregister a given serializer. This is not a thread-safe operation."
if not _serializers:

0 comments on commit c72392d

Please sign in to comment.
You can’t perform that action at this time.