Recently, I upgraded the version of Django framework from 2.0.6 to 3.0 and suddenly after calling python manage.py shell command, I got this exception:
ImportError: cannot import name 'six' from 'django.utils' (/path-to-project/project/venv/lib/python3.7/site-packages/django/utils/init.py)
Full trace:
Traceback (most recent call last):
File "manage.py", line 13, in <module>
execute_from_command_line(sys.argv)
File "/path-to-project/project/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
utility.execute()
File "/path-to-project/project/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 377, in execute
django.setup()
File "/path-to-project/project/venv/lib/python3.7/site-packages/django/__init__.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "/path-to-project/project/venv/lib/python3.7/site-packages/django/apps/registry.py", line 91, in populate
app_config = AppConfig.create(entry)
File "/path-to-project/project/venv/lib/python3.7/site-packages/django/apps/config.py", line 90, in create
module = import_module(entry)
File "/usr/lib/python3.7/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/path-to-project/project/venv/lib/python3.7/site-packages/corsheaders/__init__.py", line 1, in <module>
from .checks import check_settings # noqa: F401
File "/path-to-project/project/venv/lib/python3.7/site-packages/corsheaders/checks.py", line 7, in <module>
from django.utils import six
Similar Questions:
I read this Question and this django-3.0, release note , but those resources couldn't help me.
Why this error/exception?
From django-3.0release notes,
django.utils.six - Remove usage of this vendored library or switch to six.
means, django.utils.six module was removed from django-3.0 onwards.
My codebase isn't using "django.utils.six" module, then why this error?
This import error could be raised because of two reasons,
Most importantly, any of your installed packages are using the django.utils.six module
or maybe your codebase using the django.utils.six module
NOTE: Most of the time the first reason is the villain ππ
How can I identify which package is causing the error/exception?
The easy way is, look into your last few lines of error traceback, and it will tell you which package is causing the exceptions.
Examples
Corsheaders
In this example, corsheaders module caused the the import error
File "/path-to-project/project/venv/lib/python3.7/site-packages/corsheaders/__init__.py", line 1, in
from .checks import check_settings # noqa: F401
File "/path-to-project/project/venv/lib/python3.7/site-packages/corsheaders/checks.py", line 7, in
from django.utils import six
Example-2
In this example, jsonfield module caused the the import error
File "d:\production\myproject\venv\lib\site-packages\jsonfield\fields.py", line 21, in
from .encoder import JSONEncoder
File "d:\production\myproject\venv\lib\site-packages\jsonfield\encoder.py", line 2, in
from django.utils import six, timezone
ImportError: cannot import name 'six' from 'django.utils' (d:\production\myproject\venv\lib\site-packages\django\utils\__init__.py)
Example-3
In this example parler module caused the import error
...
File "/path/to/project/venv/lib/python3.8/site-packages/parler/utils/conf.py", line 10, in
from django.utils import six
ImportError: cannot import name 'six' from 'django.utils' (/path/to/project/venv/lib/python3.8/site-packages/django/utils/__init__.py)
Example-4
In this example django_mysql module caused the import error
File "/home/jerin/.virtualenvs/webscraperio/lib/python3.6/site-packages/django_mysql/checks.py", line 9, in
from django_mysql.utils import collapse_spaces
File "/home/jerin/.virtualenvs/webscraperio/lib/python3.6/site-packages/django_mysql/utils.py", line 17, in
from django.utils import six
ImportError: cannot import name 'six'
What is the solution?
If the error raised because of some third-party packages like django-cors-headers,django-jsonfield, etc upgrade the corresponding package versions to latest versions. If you are already using the latest version, report an issue with the developer.
If the error raised because from your codebase, use six package instead of django.utils.six module
The Django 3.0.0 release notes specify that certain private Python 2 compatibility APIs were removed. Among those was django.utils.six.
For this error specifically, #WillemVanOnsem noted that the module corsheaders was referencing this module.
For others encountering this same thing, looking at the file path on the last line of the stack trace can help with identifying the problematic module. Another example of this I've seen is:
...
File "/path/to/project/venv/lib/python3.8/site-packages/parler/utils/conf.py", line 10, in <module>
from django.utils import six
ImportError: cannot import name 'six' from 'django.utils' (/path/to/project/venv/lib/python3.8/site-packages/django/utils/__init__.py)
The module causing the issue, in this case, was parler. I hope this helps any others who encounter this issue.
Install this library: django-utils-six 2.0 for Django >= 3.
pip install django-utils-six
First, install six from pip
pip install six
Second, call six
from six import text_type
For me works, I have Django 3.0.4
As mentioned by Mohammad Masoumi, upgrading the packages will resolve the issue because corsheaders is supporting Django 3.0 now.
pip install --upgrade django-cors-headers
I also upgraded djangorestframework and drf_yasg to avoid this ImportError.
You need to update the cors headers package:
pip3 install six
pip3 install --upgrade django-cors-headers
Exception:
File "/usr/local/lib/python3.8/dist-packages/django/core/management/__init__.py", line 377, in execute
django.setup()
File "/usr/local/lib/python3.8/dist-packages/django/__init__.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "/usr/local/lib/python3.8/dist-packages/django/apps/registry.py", line 114, in populate
app_config.import_models()
File "/usr/local/lib/python3.8/dist-packages/django/apps/config.py", line 211, in import_models
self.models_module = import_module(models_module_name)
File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 783, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/usr/local/lib/python3.8/dist-packages/django_celery_beat/models.py", line 6, in <module>
import timezone_field
File "/usr/local/lib/python3.8/dist-packages/timezone_field/__init__.py", line 1, in <module>
from timezone_field.fields import TimeZoneField
File "/usr/local/lib/python3.8/dist-packages/timezone_field/fields.py", line 5, in <module>
from django.utils import six
ImportError: cannot import name 'six' from 'django.utils' (/usr/local/lib/python3.8/dist-packages/django/utils/__init__.py)
Solution:
vi /usr/local/lib/python3.8/dist-packages/timezone_field/fields.py
Change:
from django.utils import six
To:
import six
I had the same problem.
My issue was using:
pip install django_taggit==0.22.2
I resolved this when I did:
pip install django_taggit==1.2.0
because that is the latest version.
There are a number of libraries and add-ons to Django that use django.utils.six, which of course are now broken. The main one of concern is mysql-connector-python (8.0.18). The simple solution is to use the library external to Django, but the authors of these libraries will need to make their changes (or you could temporarily make the changes yourself....replace django.utils.six with six).
Folks' ideal solution is an upgrade and clean usage, but a workaround for folks in dire straits is simple enough.
In Django utils create a new file six.py and inside the file put:
import six
NOTE: Not a solution but a workaround for immediate patching
I resolved this issue by installing a higher version of corsheader package.
corsheader v3.3.0 supports Django 3.0.x
django-cors-headers==3.3.0
JSONField Solution:
I used jsonfield and jsonfiled2 packages. But in both cases, I faced the same error.
My problem solved when I have installed django-jsonfield package and uninstall the rest of the packages (related to jsonfield).
# In case you have installed the following packages, otherwise ignore them.
pip uninstall jsonfield
pip uninstall jsonfield2
pip install django-jsonfield
Usage:
from django.db import models
from jsonfield import JSONField
class ModelName(models.Model):
json_field = JSONField()
I had the exact same problem. Let me tell you how I solved it (fortunately it was simple to do).
So, what's going on?
You have to pay attention to the traceback Django is telling you (pro tip: start from the bottom):
File "/path-to-project/project/venv/lib/python3.7/site-packages/corsheaders/checks.py", line 7, in <module>
from django.utils import six
ImportError: cannot import name 'six' from 'django.utils' (/path-to-project/project/venv/lib/python3.7/site-packages/django/utils/init.py)
It tells you two important things:
What's going on: ImportError: cannot import name 'six' from 'django.utils'
Where it's happening: /lib/python3.7/site-packages/corsheaders/checks.py", line 7, in <module>
It is first telling you it cannot import the six module from django.utils, which is quite logical since Django has deprecated the module in Django 3.0.
Now you may ask:
but hey, I wasn't using that module!!
You're right, but a dependency was :)
Which dependency?
I'm glad you asked...
This one ==> /lib/python3.7/site-packages/corsheaders/checks.py, corsheaders was importing the module here: from django.utils import six in checks.py (in line 7).
What's the solution?
This issue is generally solved by updating the package that created the problem in the first place. They probably removed that import and replaced it with something else, if necessary.
Go to the command line and type:
pip install corsheaders -U
What generated the problem?
Django stopped supporting Python 2. Since django.utils.six provided "Utilities for writing code that runs on Python 2 and 3", it was not longer necessary to support this module, so it was deprecated in Django 3.
Django six is not available for Django versions higher than django2, so a quick fix is to install it via pip:
pip install django-utils-six
Then you should be good to go
If the error raised because of some third-party packages and you are already using the latest version, report an issue with the developer. If you did that but you really need a urgent fix, this strategy could make the third party package happy:
try:
# six removed since Django 3.0
from django.utils import six
except ImportError:
import six
import sys
sys.modules["django.utils.six"] = six
# similarly for any other six sub-module required:
sys.modules["django.utils.six.moves"] = six.moves
# finally, import the outdated third-party package below:
import outdated_library
As I understand, You just need to delete tokens.py file at all
if You have a greater version of Django.
And remove all imports from .tokens in other files such as views.py as well.
FYI I got this same error from using the package django-braces. I had used Conda to install it: conda install -c conda-forge django-braces. By default as of the time of this answer (Jan 24, 2023) conda-forge installs version 1.13 of django-braces, which gives rise to the "cannot import 'six' from django.utils" error.
To fix it, I did the following:
conda remove django-braces
pip install django-braces
This removes django-braces v1.13 and replaces it with v1.15, which solves the problem. Happy django-ing everyone.
I currently use django 1.11 and I'm forced to use an older version of celery (3.1) for compatibility reasons.
I want to upgrade to celery 4.0 because another part of our application needs the later version of celery.
Is there a combination of celery, django-celery and django 1.11 that is compatible? The docs say that celery 4.0 is compatible with all versions of django from 1.8 onwards, but this does not seem to be the case.
Errors occur for example when I use:
python manage.py makemigrations <appname>
Here is the error message I get:
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 363, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 337, in execute
django.setup()
File "/usr/local/lib/python2.7/dist-packages/django/__init__.py", line 27, in setup
apps.populate(settings.INSTALLED_APPS)
File "/usr/local/lib/python2.7/dist-packages/django/apps/registry.py", line 108, in populate
app_config.import_models()
File "/usr/local/lib/python2.7/dist-packages/django/apps/config.py", line 202, in import_models
self.models_module = import_module(models_module_name)
File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/usr/local/lib/python2.7/dist-packages/djcelery/models.py", line 16, in <module>
from . import managers
File "/usr/local/lib/python2.7/dist-packages/djcelery/managers.py", line 18, in <module>
from celery.utils.timeutils import maybe_timedelta
ImportError: No module named timeutils
If I revert back to celery 3.1, it works.
... File "/usr/local/lib/python2.7/dist-packages/djcelery/managers.py", line 18, in ...
You are using django-celery, a library which is no longer required since celery 3.1
Previous versions of Celery required a separate library to work with
Django, but since 3.1 this is no longer the case. Django is supported
out of the box now ...
Remove djcelery from INSTALLED_APPS, follow the linked document to see if anything else needs an update and it should work.
I am trying to get a Django application up and running. The libraries are a bit out of date (its currently on Django 1.4).
I have got it more or less working when I tried python 2.6, but when I change to a virtualenv using python 2.7 I get the error:
Unhandled exception in thread started by <function wrapper at 0x7f057b17c320>
Traceback (most recent call last):
File "/home/colin/software/virtualenvs/barshool/lib/python2.7/site-packages/django/utils/autoreload.py", line 226, in wrapper
fn(*args, **kwargs)
File "/home/colin/software/virtualenvs/barshool/lib/python2.7/site-packages/django/core/management/commands/runserver.py", line 109, in inner_run
autoreload.raise_last_exception()
File "/home/colin/software/virtualenvs/barshool/lib/python2.7/site-packages/django/utils/autoreload.py", line 249, in raise_last_exception
six.reraise(*_exception)
File "/home/colin/software/virtualenvs/barshool/lib/python2.7/site-packages/django/utils/autoreload.py", line 226, in wrapper
fn(*args, **kwargs)
File "/home/colin/software/virtualenvs/barshool/lib/python2.7/site-packages/django/__init__.py", line 18, in setup
apps.populate(settings.INSTALLED_APPS)
File "/home/colin/software/virtualenvs/barshool/lib/python2.7/site-packages/django/apps/registry.py", line 85, in populate
app_config = AppConfig.create(entry)
File "/home/colin/software/virtualenvs/barshool/lib/python2.7/site-packages/django/apps/config.py", line 90, in create
module = import_module(entry)
File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/home/colin/software/virtualenvs/barshool/lib/python2.7/site-packages/transmeta/__init__.py", line 7, in <module>
from django.utils.datastructures import SortedDict
ImportError: cannot import name SortedDict
I set up the virtualenvs with the same requirements files.
What is the difference between the versions that could be causing this?
SortedDict was removed in Django 1.9. Make sure you have installed the same version of Django in the new virtual environment as the old one.
If it was your own code that was using SortedDict, the long term fix would be to update the code to use collections.OrderedDict, which was added in Python 2.7. In your case, it looks like the import error is coming from a third party app, which you'll have to update or replace to make the code work with Django 1.9.
This seems a persistent bug. Meant the same issue while working with django==1.11.1 and djangorestframework==3.9.1. It was particularly djangorestframework (drf) which was importing the sortedDict, so i instead updated drf. The latest version at this time is djangorestframework==3.10.3 from the python foundation. This drf upgrade solved my challenge.
Note: I was working with python 3.6.8, on Ubuntu 18.04.3 LTS (just in case you need those specifics)
I've installed django on OS X 10.9.5 using pip, and everything worked great for a day. I fired it up the next day and the tool seems to be broken.
Now, any command I issue aside from "startproject" fails with the following output. I've tried starting a totally clean project, and I get the same thing.
$ django-admin manage.py check
Traceback (most recent call last):
File "/usr/local/bin/django-admin", line 11, in <module>
sys.exit(execute_from_command_line())
File "/Library/Python/2.7/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
utility.execute()
File "/Library/Python/2.7/site-packages/django/core/management/__init__.py", line 330, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Library/Python/2.7/site-packages/django/core/management/__init__.py", line 182, in fetch_command
settings.INSTALLED_APPS
File "/Library/Python/2.7/site-packages/django/conf/__init__.py", line 48, in __getattr__
self._setup(name)
File "/Library/Python/2.7/site-packages/django/conf/__init__.py", line 42, in _setup
% (desc, ENVIRONMENT_VARIABLE))
django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
Not sure how helpful it is, since this is a fresh project, but here's the output from manage.py:
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "testdjango.settings")
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
I've tried uninstall/reinstalling django. Where should I look next?
Your syntax is incorrect. You should either type
django-admin check
or
python manage.py check
That being said; django-admin is only useful when creating the project. You should use the manage.py script for project-specific tasks. From the docs:
Generally, when working on a single Django project, itβs easier to use manage.py than django-admin. If you need to switch between multiple Django settings files, use django-admin with DJANGO_SETTINGS_MODULE or the --settings command line option.
I did the steps at the tutorial " http://django-mptt.github.com/django-mptt/tutorial.html "
but it still give me the import error , I double check the code for the mptt and found the class MPTTMODEL exist in the mptt>model file
Validating models...
Unhandled exception in thread started by <bound method Command.inner_run of <django.contrib.staticfiles.management.commands.runserver.Command object at 0x1ec4710>>
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/Django-1.4-py2.7.egg/django/core/management/commands/runserver.py", line 91, in inner_run
self.validate(display_num_errors=True)
File "/usr/local/lib/python2.7/dist-packages/Django-1.4-py2.7.egg/django/core/management/base.py", line 266, in validate
num_errors = get_validation_errors(s, app)
File "/usr/local/lib/python2.7/dist-packages/Django-1.4-py2.7.egg/django/core/management/validation.py", line 30, in get_validation_errors
for (app_name, error) in get_app_errors().items():
File "/usr/local/lib/python2.7/dist-packages/Django-1.4-py2.7.egg/django/db/models/loading.py", line 158, in get_app_errors
self._populate()
File "/usr/local/lib/python2.7/dist-packages/Django-1.4-py2.7.egg/django/db/models/loading.py", line 67, in _populate
self.load_app(app_name)
File "/usr/local/lib/python2.7/dist-packages/Django-1.4-py2.7.egg/django/db/models/loading.py", line 88, in load_app
models = import_module('.models', app_name)
File "/usr/local/lib/python2.7/dist-packages/Django-1.4-py2.7.egg/django/utils/importlib.py", line 35, in import_module
__import__(name)
File "/home/kareemhashem/espace/sharek/core/models.py", line 12, in <module>
from mptt.models import MPTTModel, TreeForeignKey
ImportError: cannot import name MPTTModel
One thing you could try: Go to the console and type: python (to get the python console) and then enter: from mptt.models import MPTTModel
If this gives you an error than mptt is not correctly installed.
If you are using pip you could easily do: pip install django-mptt or you might try pip install django-mptt --upgrade to update your installation. It might be that your installation did not succeeded.
If you are not using pip or virtualenv I highly recommend it. The start is a bit tough, but it is worse to install it. See these resources to get started: 1, 2
If you have successfully installed mptt and you still cannot import it, the folder where you placed mptt into is probably not accessible to python. Therefore add the path where mptt lives to your PYTHONPATH. See this thread how to do it.