Как исправить ImportError с rest_framework_simplejwt при обновлении Django до версии 5.2.7 из-за устаревшего django.utils.timezone.utc?
Я обновляю свой Django проект до версии 5.2.7, и после установки обновленных зависимостей, я столкнулся со следующей ошибкой при выполнении python manage.py check:
ImportError: Could not import ‘rest_framework_simplejwt.authentication.JWTAuthentication’ for API setting ‘DEFAULT_AUTHENTICATION_CLASSES’. ImportError: cannot import name ‘utc’ from ‘django.utils.timezone’
Мой файл requirements.txt включает:
- Django==5.2.7
- djangorestframework_simplejwt==5.2.0
- Другие зависимости: asgiref==3.8.1, certifi==2023.11.17, django-cors-headers==4.3.1, djangorestframework==3.14.0, mysqlclient==2.2.0, PyJWT==2.8.0, pytz==2023.3, newrelic==9.0.0, sqlparse==0.4.4
Как можно решить эту проблему совместимости между Django 5.2.7 и rest_framework_simplejwt?
Ошибка ImportError возникает из-за того, что в Django 5.2.7 устарел django.utils.timezone.utc, но ваша версия djangorestframework-simplejwt (5.2.0) все еще пытается его импортировать. Решением является обновление djangorestframework-simplejwt до версии, совместимой с новым обработчиком временных зон в Django 5.2.7.
Содержание
- Понимание проблемы
- Основное решение: обновление Simple JWT
- Альтернативное решение: временное исправление
- Шаги проверки
- Предотвращение будущих проблем совместимости
Понимание проблемы
Ошибка возникает потому, что в Django 5.2.7 устарел псевдоним django.utils.timezone.utc в пользу datetime.timezone.utc. Согласно графику устаревания Django, этот псевдоним будет удален в будущих версиях.
Ваш пакет djangorestframework-simplejwt==5.2.0 все еще импортирует устаревший utc из django.utils.timezone, что вызывает ImportError при использовании Django 5.2.7, который больше не предоставляет этот псевдоним.
Важно: Это проблема совместимости между используемой версией
djangorestframework-simplejwtи устареванием функций работы с временными зонами в Django 5.2.7.
Основное решение: обновление Simple JWT
Наиболее надежным решением является обновление djangorestframework-simplejwt до последней версии, поддерживающей Django 5.2.7.
Процесс пошагового обновления:
-
Обновите пакет:
bashpip install --upgrade djangorestframework-simplejwt
-
Проверьте установленную версию (должна быть 5.3.0 или выше):
bashpip show djangorestframework-simplejwt
-
Обновите ваш requirements.txt:
djangorestframework-simplejwt==5.3.0 # или последняя версия -
Снова выполните проверку Django:
bashpython manage.py check
Согласно обсуждениям на Stack Overflow, обновление
djangorestframework-simplejwtс версии 4.4.0 до 4.6.0 решило аналогичные проблемы, а более новые версии были обновлены для обработки изменений временных зон в Django.
Альтернативное решение: временное исправление
Если вы не можете немедленно обновить djangorestframework-simplejwt, вы можете временно обойти проблему, создав модуль совместимости.
Создание модуля совместимости:
-
Создайте новый файл в вашем проекте (например,
compat/timezone.py):python# compat/timezone.py import warnings from datetime import timezone # Временная совместимость для устаревшего django.utils.timezone.utc utc = timezone.utc # Подавление предупреждения об устаревании warnings.filterwarnings( 'ignore', category=RemovedInDjango50Warning, module='django.utils.timezone' ) -
Обновите настройки Django для использования этого модуля:
python# settings.py import sys from pathlib import Path # Добавление модуля совместимости в Python путь BASE_DIR = Path(__file__).resolve().parent.parent sys.path.append(str(BASE_DIR / 'compat')) # Настройка REST_FRAMEWORK REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework_simplejwt.authentication.JWTAuthentication', ], }
Примечание: Это временное решение. Вы все равно должны планировать обновление
djangorestframework-simplejwtдля обеспечения долгосрочной совместимости и избежания потенциальных проблем безопасности.
Шаги проверки
После применения одного из решений убедитесь, что проблема решена:
-
Выполните проверку Django:
bashpython manage.py check
-
Протестируйте поток аутентификации:
bashpython manage.py runserver
Затем протестируйте ваши API-эндпоинты, использующие JWT-аутентификацию.
-
Проверьте наличие оставшихся предупреждений:
bashpython manage.py check --deploy
Если проблема все еще сохраняется, проверьте журнал изменений django-rest-framework-simplejwt на предмет конкретных требований или изменений.
Предотвращение будущих проблем совместимости
Чтобы избежать аналогичных проблем в будущем:
-
Регулярно обновляйте зависимости:
bashpip list --outdated pip freeze > requirements.txt
-
Тестируйте с последними версиями в промежуточной среде перед развертыванием в продакшене.
-
Следите за графиком устаревания Django и планируйте обновления соответственно.
-
Используйте виртуальные среды для изоляции зависимостей проекта:
bashpython -m venv venv source venv/bin/activate # В Windows: venv\Scripts\activate pip install -r requirements.txt -
Рассмотрите использование инструментов управления зависимостями, таких как Poetry или pip-tools, для лучшего контроля версий.
Источники
- График устаревания Django - устаревание timezone.utc
- Stack Overflow: ImportError Django 5.2.7 + rest_framework_simplejwt
- Журнал изменений djangorestframework-simplejwt
Заключение
Ошибка ImportError с rest_framework_simplejwt при обновлении до Django 5.2.7 вызвана устареванием django.utils.timezone.utc. Основным решением является обновление djangorestframework-simplejwt до версии, поддерживающей новый обработчик временных зон в Django 5.2.7. Если немедленное обновление невозможно, временный модуль совместимости может обеспечить обходной путь, но его следует заменить на правильное обновление как можно скорее. Регулярное управление зависимостями и отслеживание графика устаревания Django помогут предотвратить аналогичные проблемы совместимости в будущем.