Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

701
Vistas
La función django.contrib.auth.login() no devuelve a ningún usuario como conectado

Creé una aplicación básica utilizando el sistema de autenticación integrado de Django. Creé con éxito un objeto Usuario en el shell usando >>python manage.py createsuperuser .

Luego creé una vista básica, 'UserLogin' junto con los serializadores/urls correspondientes, para iniciar sesión en un usuario existente usando las funciones django.contrib.auth autenticar() e iniciar sesión(). Al probar con las credenciales de mi usuario creado, la función de inicio de sesión parecía haber funcionado correctamente.

Para probar esto, creé otra función de visualización, 'CurrentUser', que devuelve el nombre de usuario del usuario actualmente conectado. Sin embargo, esta vista devuelve al usuario como vacío.

¿Por qué la vista 'CurrentUser' no devuelve ningún usuario que haya iniciado sesión? He adjuntado mi código (menos las importaciones) a continuación.

vistas.py:

 class UserLogin(APIView): def post(self, request, format = None): serializer = UserLoginSerializer(data=request.data) if serializer.is_valid(): user = authenticate(username=serializer.validated_data["username"], password=serializer.validated_data["password"]) if user is not None: login(request, user) return Response(UserSerializer(user).data, status=status.HTTP_201_CREATED) return Response("Invalid username/password", status=status.HTTP_401_UNAUTHORIZED) return Response(serializer.errors, status=status.HTTP_401_UNAUTHORIZED) class CurrentUser(APIView): def get(self, request, format = None): return Response(self.request.user.username)

serializadores.py:

 class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ['id', 'username'] class UserLoginSerializer(serializers.Serializer): username = serializers.CharField(max_length=300, required=True) password = serializers.CharField(required=True, write_only=True)

urls.py:

 urlpatterns = [ path('login/', views.UserLogin.as_view()), path('current/', views.CurrentUser.as_view()) ]

Cualquier orientación sería muy apreciada.

Gracias

over 4 years ago · Santiago Trujillo
6 Respuestas
Responde la pregunta

0

Una causa de esto podría ser la falta de SessionMiddleware :

  1. Su vista /login funciona
  2. Persiste cosas en la sesión pero el middleware no está instalado
  3. La próxima solicitud a /current no está vinculada a la sesión autenticada

¿Puedes verificar que settings.MIDDLEWARES contenga django.contrib.sessions.middleware.SessionMiddleware ?

over 4 years ago · Santiago Trujillo Denunciar

0

Estaba intentando probar la autenticación de forma incorrecta. Esta es la API, que no tiene estado . Es decir, Django no tiene idea sobre la solicitud anterior que ha realizado al UserLogin .

Por lo tanto, debe adjuntar el token y la ID de sesión (o algo que pueda usarse para identificar al usuario) con la "segunda solicitud" .

Dado que está utilizando DRF, no tiene que escribir sus propios mecanismos de autenticación. Puede usar la Autenticación básica de DRF (o cualquier otro esquema de autenticación) para autenticarse.

Entonces, cambia tu vista como

 from rest_framework.authentication import BasicAuthentication from rest_framework.permissions import IsAuthenticated class CurrentUser(APIView): authentication_classes = (BasicAuthentication,) permission_classes = (IsAuthenticated,) def get(self, request, format=None): return Response({ "user": { "id": request.user.id, "username": request.user.username }})

Ejecución mediante requests

 In [5]: import requests In [6]: from requests import auth In [7]: response = requests.get(url=url, auth=auth.HTTPBasicAuth("admin", "passme123@#$") ) In [8]: print(response.json()) {'user': {'id': 1, 'username': 'admin'}}

Dado que está utilizando DRF, puede utilizar cualquiera de estos esquemas de autenticación DRF en su base de código

over 4 years ago · Santiago Trujillo Denunciar

0

Debe establecer la clase de autenticación predeterminada como clase de autenticación de sesión en la configuración de DRF. Lea más sobre esto aquí [1].

La autenticación de sesión utiliza el ID de sesión para identificar al usuario. Por lo tanto, debe enviar la identificación de sesión basada en cookies en la solicitud. Lea sobre la autenticación de sesión aquí [2].

por ejemplo:

 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', # <-- set this class ] }

Usa este código:

 def post(self, request, format = None): serializer = UserLoginSerializer(data=request.data) if serializer.is_valid(): user = authenticate(username=serializer.validated_data["username"], password=serializer.validated_data["password"]) if user: return Response(UserSerializer(user).data, status=status.HTTP_201_CREATED) return Response("Invalid username/password", status=status.HTTP_401_UNAUTHORIZED) return Response(serializer.errors, status=status.HTTP_401_UNAUTHORIZED)

Pero mi recomendación es usar Token auth [3].

Para usar token auth 2, las cosas cambiarán:

  1. La clase de autenticación predeterminada en la configuración de DRF
  2. Al enviar una solicitud a cualquier vista de API de DRF, debe enviar el encabezado Auth como Token <token-value>

Su método de publicación y el código de vistas de la API seguirán siendo los mismos.

[1] https://www.django-rest-framework.org/api-guide/authentication/#setting-the-authentication-scheme

[2] https://www.django-rest-framework.org/api-guide/authentication/#sessionauthentication

[3] https://www.django-rest-framework.org/api-guide/authentication/#tokeauthentication

over 4 years ago · Santiago Trujillo Denunciar

0

Dado que está utilizando el marco de descanso de Django, supongo que está desarrollando apis de descanso. Rest Apis por diseño está destinado a ser sin estado, lo que significa que no habrá dos solicitudes que dependan entre sí.

Lo que esto significa esencialmente es que debe autenticar cada solicitud y configurar al usuario en la solicitud después de la autenticación.

Hay muchas formas de hacerlo, como muchos han sugerido usar basicAuth, o autenticación basada en token. Todo lo cual podemos implementar fácilmente leyendo la documentaciónAuth Doc

Las vistas de django listas para usar utilizan cookies para identificar al usuario que ha iniciado sesión. Que en este caso no es útil.

over 4 years ago · Santiago Trujillo Denunciar

0

Estoy usando DRF para iniciar sesión. Puede verificar estos serializadores y la vista de inicio de sesión.

serializadores.py:

 class LoginSerializer(serializers.Serializer): username = serializers.CharField() password = serializers.CharField() def validate(self, data): user = authenticate(**data) if user and user.is_active: return user raise serializers.ValidationError("Incorrect Credentials")

vista de inicio de sesión:

 class LoginAPIView(generics.GenericAPIView): queryset = User.objects.all() permission_classes = [AllowAny] serializer_class = LoginSerializer def post(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.validated_data return Response({ "user": UserSerializer(user, context=self.get_serializer_context()).data, "token": AuthToken.objects.create(user)[1] })

settings.py clases de marco de descanso:

REST_FRAMEWORK = {

 'DEFAULT_AUTHENTICATION_CLASSES': [ # 'rest_framework.authentication.BasicAuthentication', # 'rest_framework.authentication.SessionAuthentication', 'knox.auth.TokenAuthentication', ], 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' ], 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']

}

over 4 years ago · Santiago Trujillo Denunciar

0

Debe adjuntar un token de autenticación y una identificación de sesión para su propósito. Deseo que este documento te sea útil. Te recomiendo que uses Token Auth2. https://www.django-rest-framework.org/api-guide/authentication/#tokeauthentication

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda