Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

709
Views
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 answers
Answer question

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 Report

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 Report

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 Report

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!