﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
21335	Bundled importlib some times won't work properly with python3.3	Andrei Antoukh	nobody	"In one of my project some times (the most common case, run runserver, change code, runsever reloads) and in some requests is raised strange KeyError:



{{{
Traceback (most recent call last):
  File ""/home/niwi/.envs/greenmine/lib/python3.3/site-packages/django/core/handlers/base.py"", line 114, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File ""/home/niwi/.envs/greenmine/lib/python3.3/site-packages/rest_framework/viewsets.py"", line 78, in view
    return self.dispatch(request, *args, **kwargs)
  File ""/home/niwi/.envs/greenmine/lib/python3.3/site-packages/django/views/decorators/csrf.py"", line 57, in wrapped_view
    return view_func(*args, **kwargs)
  File ""/home/niwi/.envs/greenmine/lib/python3.3/site-packages/rest_framework/views.py"", line 399, in dispatch
    response = self.handle_exception(exc)
  File ""/home/niwi/devel/greenmine-back/greenmine/base/monkey.py"", line 23, in handle_exception
    return super(APIView, self).handle_exception(exc)
  File ""/home/niwi/.envs/greenmine/lib/python3.3/site-packages/rest_framework/views.py"", line 396, in dispatch
    response = handler(request, *args, **kwargs)
  File ""/home/niwi/.envs/greenmine/lib/python3.3/site-packages/rest_framework/mixins.py"", line 139, in partial_update
    return self.update(request, *args, **kwargs)
  File ""/home/niwi/.envs/greenmine/lib/python3.3/site-packages/django/db/transaction.py"", line 338, in inner
    return func(*args, **kwargs)
  File ""/home/niwi/devel/greenmine-back/greenmine/base/api.py"", line 28, in update
    return super().update(*args, **kwargs)
  File ""/home/niwi/.envs/greenmine/lib/python3.3/site-packages/rest_framework/mixins.py"", line 132, in update
    self.post_save(self.object, created=created)
  File ""/home/niwi/devel/greenmine-back/greenmine/projects/userstories/api.py"", line 90, in post_save
    super().post_save(obj, created)
  File ""/home/niwi/devel/greenmine-back/greenmine/base/notifications/api.py"", line 25, in post_save
    context[""changed_fields_dict""] = obj.get_changed_fields_dict(self.request.DATA)
  File ""/home/niwi/devel/greenmine-back/greenmine/base/notifications/models.py"", line 77, in get_changed_fields_dict
    field_dict.update(self._get_changed_field(field_name, data_value))
  File ""/home/niwi/devel/greenmine-back/greenmine/base/notifications/models.py"", line 126, in _get_changed_field
    old_value = self._get_changed_field_old_value(field_name, data_value)
  File ""/home/niwi/devel/greenmine-back/greenmine/base/notifications/models.py"", line 119, in _get_changed_field_old_value
    return (self.last_version and self.last_version.field_dict.get(field_name, data_value) or None)
  File ""/home/niwi/.envs/greenmine/lib/python3.3/site-packages/reversion/models.py"", line 177, in field_dict
    object_version = self.object_version
  File ""/home/niwi/.envs/greenmine/lib/python3.3/site-packages/reversion/models.py"", line 164, in object_version
    return list(serializers.deserialize(self.format, data, ignorenonexistent=True))[0]
  File ""/home/niwi/.envs/greenmine/lib/python3.3/site-packages/django/core/serializers/__init__.py"", line 132, in deserialize
    d = get_deserializer(format)
  File ""/home/niwi/.envs/greenmine/lib/python3.3/site-packages/django/core/serializers/__init__.py"", line 111, in get_deserializer
    _load_serializers()
  File ""/home/niwi/.envs/greenmine/lib/python3.3/site-packages/django/core/serializers/__init__.py"", line 144, in _load_serializers
    register_serializer(format, BUILTIN_SERIALIZERS[format], serializers)
  File ""/home/niwi/.envs/greenmine/lib/python3.3/site-packages/django/core/serializers/__init__.py"", line 69, in register_serializer
    module = importlib.import_module(serializer_module)
  File ""/home/niwi/.envs/greenmine/lib/python3.3/site-packages/django/utils/importlib.py"", line 36, in import_module
    return sys.modules[name]
KeyError: 'django.core.serializers.pyyaml'
}}}

Saying code of bundled importlib...

{{{#!python
def import_module(name, package=None):
    """"""Import a module.

    The 'package' argument is required when performing a relative import. It
    specifies the package to use as the anchor point from which to resolve the
    relative import to an absolute import.

    """"""
    if name.startswith('.'):
        if not package:
            raise TypeError(""relative imports require the 'package' argument"")
        level = 0
        for character in name:
            if character != '.':
                break
            level += 1
        name = _resolve_name(name[level:], package, level)
    __import__(name)
    return sys.modules[name]
}}}

... seems {{{__import__}}} is called with ""django.core.serializers.pyyaml"" but it does nothing (not raises ImportError, but it should do it) and sys.modules, obviously not contains ""django.core.serializers.pyyaml"".

(Note: I don't have pyyaml installed and I not use it on my project...)

I don't have deterministic way to reproduce this, because it hapens sometimes using python3.3 and django1.6(alpha->rc1).

I think that it happens because a python2.7 importlib isn't work properly with python3 and a simple solution is use python3 importlib if you running django with python3:

https://github.com/niwibe/django/commit/2f73c41ed0e6e357b6710ae3b5bce4d7d55870cc

I know that importlib is now deprecated on master, but I think it should fixed also in 1.5, 1.6 and master.

Thanks.

"	Bug	closed	Python 3	dev	Normal	fixed			Accepted	1	0	0	0	0	0
