#21335: Bundled importlib some times won't work properly with python3.3
-------------------------------+--------------------
     Reporter:  niwi           |      Owner:  nobody
         Type:  Uncategorized  |     Status:  new
    Component:  Python 3       |    Version:  master
     Severity:  Normal         |   Keywords:
 Triage Stage:  Unreviewed     |  Has patch:  1
Easy pickings:  0              |      UI/UX:  0
-------------------------------+--------------------
 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.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/21335>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/047.428d51f45636750a11b5811c96cd4100%40djangoproject.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to