Estaba tratando de seguir este inicio rápido desde la documentación de djangorestframework-simplejwt con el enlace https://django-rest-framework-simplejwt.readthedocs.io/en/latest/getting_started.html
Pero tengo un problema cuando trato de obtener el token y siempre devuelvo este error 'str' object has no attribute 'decode'
Editado: este es mi código en urls.py
from django.contrib import admin from django.urls import path from rest_framework_simplejwt import views as jwt_views from core.views import HelloView urlpatterns = [ path('admin/', admin.site.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'), path('hello/', HelloView.as_view(), name='hello'), ]configuración.py
... INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', ] ... REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework_simplejwt.authentication.JWTAuthentication', ], } ...vistas.py
from django.shortcuts import render # Create your views here. from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated class HelloView(APIView): permission_classes = (IsAuthenticated,) def get(self, request): content = {'message': 'Hello, World!'} return Response(content)La degradación de PyJWT hizo el trabajo por mí.
Para lograrlo, cambie la línea correspondiente en su requirements.txt a
PyJWT==v1.7.1o instale el paquete especificado con:
pip install pyjwt==v1.7.1Tenía PyJWT-2.3.0 instalado y ni siquiera estaba adivinando si este problema podría estar relacionado con la versión.
Las respuestas anteriores me ayudaron a descifrar esto. Así que solo estoy escribiendo lo mismo con algunos detalles de registro adicionales.
pip install PyJWT==1.7.1
(venv) ip-192-168-1-36:django_proj rishi$ pip install PyJWT==1.7.1 Collecting PyJWT==1.7.1 Using cached PyJWT-1.7.1-py2.py3-none-any.whl (18 kB) Installing collected packages: PyJWT Attempting uninstall: PyJWT Found existing installation: PyJWT 2.3.0 Uninstalling PyJWT-2.3.0: Successfully uninstalled PyJWT-2.3.0 Successfully installed PyJWT-1.7.1Finalmente mi problema se resolvió. Gracias a las respuestas anteriores para ayudarme en esto.
Eliminar .decode('utf-8') en "/venv/lib/python3.9/site-packages/rest_framework_jwt/utils.py" como
# /venv/lib/python3.9/site-packages/rest_framework_jwt/utils.py def jwt_encode_handler(payload): key = api_settings.JWT_PRIVATE_KEY or jwt_get_secret_key(payload) return jwt.encode( payload, key, api_settings.JWT_ALGORITHM )#.decode('utf-8') ==> delete thisCuando instaló simple-jwt, jwt se actualizó a la versión 2.3.0 desde 1.7.1 (tal vez). y por esto,
"-> str:" se ha agregado al método "encode", y esto significa que "encode" devuelve "str".
por lo que ya no necesitamos .decode('utf-8') en utils.py en rest_framework_jwt.
y si ejecuta el servidor nuevamente, puede encontrar el problema a continuación.
excepto jwt.ExpiredSignature: rest_framework.request.WrappedAttributeError: el módulo 'jwt' no tiene el atributo 'ExpiredSignature'
puedes arreglar esto de la siguiente manera,
# /venv/lib/python3.9/site-packages/rest_framework_jwt/authentication.py try: payload = jwt_decode_handler(jwt_value) except jwt.ExpiredSignatureError: # ExpiredSignature => no more exists msg = _('Signature has expired.') raise exceptions.AuthenticationFailed(msg) except jwt.DecodeError: msg = _('Error decoding signature.') raise exceptions.AuthenticationFailed(msg)jwt2.3.0-autenticación-excepto
este problema ocurrió porque la versión jwt se actualizó a 2.3.0 y ExpiredSignature ya no existe.
Pero le recomendamos que baje la versión de jwt a 1.7.1 ya que no conocemos todos los cambios realizados por la actualización.
para mí, deje degradar jwt a la versión 1.7.1
para hacer eso, actualice la línea correspondiente require.txt o, si no es la línea PyJWT, agregue esta línea
PyJWT==v1.7.1