Django REST API中JWT认证模块已安装却无法识别的问题求助
Django JWT认证启动报错排查
问题背景
在基于Django搭建的API中实现JWT认证,安装了rest_framework_jwt包并按文档配置后,启动服务器时出现ModuleNotFoundError: No module named 'rest_framework_simplejwt'错误。
启动错误日志
Watching for file changes with StatReloader Exception in thread django-main-thread: Traceback (most recent call last): File "/usr/local/lib/python3.11/threading.py", line 1038, in _bootstrap_inner self.run() File "/usr/local/lib/python3.11/threading.py", line 975, in run self._target(*self._args, **self._kwargs) File "/usr/local/lib/python3.11/site-packages/django/utils/autoreload.py", line 64, in wrapper fn(*args, **kwargs) File "/usr/local/lib/python3.11/site-packages/django/core/management/commands/runserver.py", line 125, in inner_run autoreload.raise_last_exception() File "/usr/local/lib/python3.11/site-packages/django/utils/autoreload.py", line 87, in raise_last_exception raise _exception[1] File "/usr/local/lib/python3.11/site-packages/django/core/management/__init__.py", line 398, in execute autoreload.check_errors(django.setup)() File "/usr/local/lib/python3.11/site-packages/django/utils/autoreload.py", line 64, in wrapper fn(*args, **kwargs) File "/usr/local/lib/python3.11/site-packages/django/__init__.py", line 24, in setup apps.populate(settings.INSTALLED_APPS) File "/usr/local/lib/python3.11/site-packages/django/apps/registry.py", line 91, in populate app_config = AppConfig.create(entry) ^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/django/apps/config.py", line 193, in create import_module(entry) File "/usr/local/lib/python3.11/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "<frozen importlib._bootstrap>", line 1206, in _gcd_import File "<frozen importlib._bootstrap>", line 1178, in _find_and_load File "<frozen importlib._bootstrap>", line 1128, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed File "<frozen importlib._bootstrap>", line 1206, in _gcd_import File "<frozen importlib._bootstrap>", line 1178, in _find_and_load File "<frozen importlib._bootstrap>", line 1142, in _find_and_load_unlocked ModuleNotFoundError: No module named 'rest_framework_simplejwt'
settings.py 配置
import os from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'django-insecure-uh*2t%%^q0mzj!5r@9=7i$!16wwm)96e=-zh)8&l)-&d3(_!)i' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = int(os.environ.get('DEBUG',default=0)) ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.sites', #3rd party 'rest_framework', 'rest_framework.authtoken', 'allauth', 'allauth.account', 'allauth.socialaccount', 'dj_rest_auth', 'dj_rest_auth.registration', 'rest_framework_simplejwt.token_blacklist', #local apps 'posts.apps.PostsConfig', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'stackstagram.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'stackstagram.wsgi.application' # Database # https://docs.djangoproject.com/en/4.1/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER':'postgres', 'PASSWORD':'postgres', 'HOST':'db', 'PORT':5432 } } # Password validation # https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/4.1/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/4.1/howto/static-files/ STATIC_URL = 'static/' # Default primary key field type # https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' REST_FRAMEWORK = { 'DEFUALT_PERMISSION_CLASSES':[ 'rest_framework.permissions.IsAuthenticated', ], 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework_simplejwt.authentication.JWTAuthentication', 'rest_framework.authentication.SessionAuthentication', ], } EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' SITE_ID = 1 MEDIA_URL = "\/media\/" MEDIA_ROOT = os.path.join(BASE_DIR/'media')
项目级 urls.py 配置
from django.contrib import admin from django.urls import path,include from django.conf import settings from django.conf.urls.static import static from rest_framework_simplejwt import views as jwt_views urlpatterns = [ path('admin/', admin.site.urls), path('api/v1/', include('posts.urls')), path('api-auth/',include('rest_framework.urls')), path('api/v1/rest-auth/',include('dj_rest_auth.urls')), path('api/v1/rest-auth/registration/',include('dj_rest_auth.registration.urls')), path('api/token/', jwt_views.TokenObtainPairView.as_view(), name='token_obtain_pair'), path('api/token/refresh/', jwt_views.TokenRefreshView.as_view(), name='token_refresh'), ] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
问题原因与解决办法
核心问题
你安装的是rest_framework_jwt,但项目配置里全用的是rest_framework_simplejwt——这是两个完全独立的JWT实现包。rest_framework_jwt是旧版维护包,而rest_framework_simplejwt是Django REST Framework官方推荐的新版JWT库,两者不能混用。
解决步骤
方案一:改用rest_framework_simplejwt(推荐)
- 卸载已安装的旧包:
pip uninstall djangorestframework-jwt - 安装新版包:
pip install djangorestframework-simplejwt - 保持现有配置不变(你的settings.py和urls.py已经是按simplejwt配置的),重新启动服务器即可。
方案二:改用rest_framework_jwt(不推荐,包已停止维护)
如果非要用旧包,需要把所有配置里的rest_framework_simplejwt替换成rest_framework_jwt:
- 移除
INSTALLED_APPS里的rest_framework_simplejwt.token_blacklist(旧包无此功能) - 将
REST_FRAMEWORK的DEFAULT_AUTHENTICATION_CLASSES换成'rest_framework_jwt.authentication.JSONWebTokenAuthentication' - 把urls.py里的导入和路由换成旧包对应内容,比如获取token的路由改为
rest_framework_jwt.views.obtain_jwt_token等
另外注意:你settings.py里的DEFUALT_PERMISSION_CLASSES拼写错误,正确应为DEFAULT_PERMISSION_CLASSES,这个错误会导致权限配置不生效,建议一并修正。
内容的提问来源于stack exchange,提问作者Adhishraya Sharma
相关产品推荐
相关产品推荐

