Estoy creando una aplicación web de inventario y me encuentro con este error. Estoy tratando de obtener el nombre de usuario del token para mostrar un mensaje de saludo personalizado y mostrar que el usuario inició sesión como alguien.
Aquí está mi Views.py que obtiene Token de localStorage como usuario conectado:
class UserDetails(APIView): def post(self, request): serializer = UserAccountTokenSendSerializer(data=request.data) global token if serializer.is_valid(): token = serializer.validated_data['token'] return Response(serializer.data) def get(self): user_id = Token.objects.get(key=token).user_id details = User.objects.get(id=user_id) serializer = UserDetails(details, many=False) return Response(serializer.data) class UserDetails(serializers.ModelSerializer): class Meta: model = User fields = ( 'username', )Aquí está mi Urls.py:
urlpatterns = [ path('get-user-token/', views.UserDetails.as_view()), path('get-user-details/', views.UserDetails.as_view()), ]Y este es el error que me sale:
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/rest_framework/views.py", line 506, in dispatch response = handler(request, *args, **kwargs) TypeError: get() takes 1 positional argument but 2 were given [15/Jun/2022 19:34:59] "GET /api/v1/get-user-details/ HTTP/1.1" 500 82239El .get(…) [Django-doc] también toma un parámetro de request , incluso si no lo usa, así que:
class UserDetails(APIView): # … def get(self , request ): # … pass Recomiendo encarecidamente no convertir token en una variable global. El mismo servidor web puede ser utilizado por otro usuario que por lo tanto no se haya autenticado (correctamente). Eche un vistazo a lasección Autenticación de la documentación del marco Django REST para obtener más información sobre cómo autenticar y verificar las credenciales.
Nota : en Django, las vistas basadas en clases (CBV) a menudo tienen un sufijo de
…Viewpara evitar conflictos con los nombres de los modelos. Por lo tanto, podría considerar cambiar el nombre de la clase de vista aUserDetailsView, en lugar de.UserDetails