Récemment, j'ai mis à niveau la version du framework Django de 2.0.6
à 3.0
et soudainement après avoir appelé la commande python manage.py shell
, j'ai eu cette exception:
ImportError: impossible d'importer le nom 'six' depuis 'django.utils' (/chemin-to-project/project/venv/lib/python3.7/site-packages/django/utils/ init .py)
Trace complète:
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
Questions similaires:
J'ai lu cette question et cette note de publication de django-3.0 , mais ces ressources n'ont pas pu m'aider.
18 Réponses :
Les notes de publication de Django 3.0.0 spécifient que certaines API de compatibilité Python 2 privées ont été supprimées . Parmi ceux-ci se trouvait django.utils.six
.
Pour cette erreur spécifiquement, @WillemVanOnsem a noté que les corsheaders
du module corsheaders
référence à ce module.
Pour les autres rencontrant la même chose, regarder le chemin du fichier sur la dernière ligne de la trace de la pile peut aider à identifier le module problématique. Un autre exemple de cela que j'ai vu est:
... 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)
Le module à l'origine du problème, dans ce cas, était parler
. J'espère que cela aidera tous les autres qui rencontrent ce problème.
Veuillez installer la version inférieure de Django, dans mon cas, j'ai installé Django-2.1.4.
@ smartworld-dm La rétrogradation de la version Django résoudra le problème, mais vous ne pouvez pas toujours rester dans les anciennes versions, le changement est inévitable
@ArakkalAbu En fait, mon projet utilisait Django-2.1.4 et Django 3.0.0 a été installé accidentellement.
Bas Django résout mon problème. J'attendrai que les modules mettent à jour leurs versions.
Il existe un certain nombre de bibliothèques et de modules complémentaires à Django qui utilisent django.utils.six, qui bien sûr sont maintenant cassés. Le principal sujet de préoccupation est mysql-connector-python (8.0.18). La solution simple est d'utiliser la bibliothèque externe à Django, mais les auteurs de ces bibliothèques devront effectuer leurs modifications (ou vous pouvez temporairement faire les modifications vous-même .... remplacer django.utils.six par six).
Comme mentionné par Mohammad Masoumi, la mise à niveau des packages résoudra le problème car corsheaders
prend désormais en charge Django 3.0.
pip install --upgrade django-cors-headers
J'ai également mis à jour djangorestframework
et drf_yasg
pour éviter cette ImportError.
J'ai eu le même problème.
Mon problème utilisait:
pip install django_taggit==1.2.0
J'ai résolu cela quand j'ai fait:
pip install django_taggit==0.22.2
car c'est la dernière version.
Cette réponse pourrait être utile, mais elle est préférable en tant que commentaire sous le message d'origine, car d'autres personnes ont déjà recommandé de mettre à niveau d'autres packages.
À partir des notes de publication de django-3.0 ,
django.utils.six
- Supprimez l'utilisation de cette bibliothèque vendue ou passez à six .
signifie django.utils.six
module django.utils.six
été supprimé à partir de django-3.0 .
django.utils.six
", alors pourquoi cette erreur?Cette erreur d'importation peut être générée pour deux raisons,
django.utils.six
django.utils.six
REMARQUE: la plupart du temps, la première raison est le méchant 😠– 😖
Le moyen le plus simple est de regarder vos dernières lignes de suivi des erreurs et il vous indiquera quel package est à l'origine des exceptions.
Dans cet exemple, le module corsheaders
provoqué l'erreur d'importation
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'
Dans cet exemple, le module jsonfield
provoqué l'erreur d'importation
... 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)
Dans cet exemple, le module parler
causé l'erreur d'importation
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)
Dans cet exemple, le module django_mysql
provoqué l'erreur d'importation
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
Si l'erreur s'est django-cors-headers
cause de certains packages tiers tels que django-cors-headers
, django-jsonfield
, etc., django-jsonfield
niveau les versions de package correspondantes vers les dernières versions .
Si l'erreur s'est django.utils.six
partir de votre base de code, utilisez six packages au lieu du module django.utils.six
Solution JSONField :
J'ai utilisé les jsonfield
et jsonfiled2
. Mais dans les deux cas, j'ai fait face à la même erreur.
Mon problème a été résolu lorsque j'ai installé le django-jsonfield
et désinstallé le reste des packages (liés à jsonfield).
from django.db import models from jsonfield import JSONField class ModelName(models.Model): json_field = JSONField()
Utilisation :
# In case you have installed the following packages, otherwise ignore them. pip uninstall jsonfield pip uninstall jsonfield2 pip install django-jsonfield
Exception:
import six
Solution:
from django.utils import six
Changement:
vi /usr/local/lib/python3.8/dist-packages/timezone_field/fields.py
À:
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)
Modifier les packages installés comme celui-ci n'est pas une bonne idée. Si vous installez les mêmes packages sur un nouveau serveur, vous obtiendrez à nouveau une erreur. Dans ce cas, une meilleure solution consiste à mettre à niveau django-timezone-field
- la version 4.0 a ajouté la prise en charge de Django 3.0.
Vous devez mettre à jour le package des en-têtes cors:
pip3 install six pip3 install --upgrade django-cors-headers
le simple fait de passer à django == 2.2 et d'installer six a résolu le problème pour moi. Pourquoi avons-nous besoin de mettre à jour les cors-headers?
Si vous avez mis à jour votre version de django vers 3.x, vous devriez envisager de mettre à jour cors-headers. C'est une autre alternative également.
La solution idéale pour les gens est une mise à niveau et une utilisation propre, mais une solution de contournement pour les personnes en difficulté est assez simple.
Dans Django
utils, créez un nouveau fichier six.py et à l'intérieur du fichier mettez:
import six
REMARQUE: pas une solution mais une solution de contournement pour un correctif immédiat
Tout d'abord, installez six à partir de pip
from six import text_type
Deuxièmement, appelez six
pip install six
Pour moi fonctionne, j'ai Django 3.0.4
Veuillez ajouter le lien manquant
Je ne me souviens plus du lilnk exact maintenant mais je suis sûr que c'était quelque chose comme ça ... en tout cas merci;)
pip installer six
au-dessus des packages de site \ django \ utils \ encoding.py, importez 'from six import python_2_unicode_compatible'
exécuter python manage.py makemigrations et python manage.py migrate
J'ai également supprimé mon urllib3 et mon chardet
J'ai eu l'erreur en essayant d'intégrer Disqus dans mon application, qui est résolue en installant simplement le django-six
.
pip install django-six
J'ai résolu ce problème en installant une version supérieure du package corsheader
.
corsheader
v3.3.0 prend en charge Django 3.0.x
django-cors-headers==3.3.0
Changez-le!
importez six et cela résoudra certainement le problème.
Si je comprends bien, il vous suffit de supprimer le fichier tokens.py
si vous avez une version supérieure de Django. Supprimez également toutes les importations from .tokens
dans d'autres fichiers tels que views.py
.
Installez cette bibliothèque: django-utils-six
2.0 pour Django> 3.
pip install django-utils-six
J'ai eu exactement le même problème. Laissez-moi vous dire comment je l'ai résolu (heureusement, c'était simple à faire).
Vous devez faire attention au traçage que Django vous dit ( conseil de pro : commencez par le bas):
pip install corsheaders -U
Il vous dit deux choses importantes:
ImportError: cannot import name 'six' from 'django.utils'
/lib/python3.7/site-packages/corsheaders/checks.py", line 7, in <module>
Il vous dit d'abord qu'il ne peut pas importer les six
modules de django.utils
, ce qui est assez logique puisque Django a désapprouvé le module dans Django 3.0 .
Maintenant, vous pouvez demander:
Celui-ci ==> /lib/python3.7/site-packages/corsheaders/checks.py
, corsheaders
importait le module ici: à from django.utils import six
dans checks.py
(en ligne 7).
Ce problème est généralement résolu en mettant à jour le package qui a créé le problème en premier lieu. Ils ont probablement supprimé cette importation et l'ont remplacée par autre chose, si nécessaire. Accédez à la ligne de commande et tapez:
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)
Django a cessé de prendre en charge Python 2. Puisque django.utils.six
fournissait des " Utilitaires pour écrire du code qui s'exécute sur Python 2 et 3 ", il n'était plus nécessaire de supporter ce module, il était donc obsolète dans Django 3.
Vous utilisez un package
corsheaders
qui utilise toujours un module qui a été supprimé.@MohammadMasoumi En gros, supprimez les déclarations explicites comme
from django.utils import six
si vous en avez dans votre code, puisfrom django.utils import six
systématiquement aux versions de tous les packages dansrequirements.txt
qui se plaignent de cela. Dans mon cas, j'ai dû également bumpdjango-nested-admin
etdjangorestframework
.Si vous travaillez avec un paquet qui n'a pas été mis à jour pour fonctionner avec django 3.0, vous pouvez résoudre ce problème avec un simple patch .
Salut Mohammad, Votre problème est-il résolu? Quelle est la bonne solution?
Salut @MostafaGhadimi, comme @WillemVanOnsem l'a mentionné, je l'ai résolu en mettant à jour le paquet
corsheaders
. Je vous remercie d'avoir partagé votre expérience comme réponse ici, j'espère que cela résoudra le problème de quelqu'un.