TypeError: get() принимает 1 позиционный аргумент, но было задано 2
Я создаю веб-приложение Inventory и сталкиваюсь с этой ошибкой. Я пытаюсь получить имя пользователя из токена, чтобы показать пользовательское сообщение приветствия и показать, что пользователь вошел в систему как кто-то.
Вот мой Views.py, который получает Token из localStorage как зарегистрированный пользователь:
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',
)
Вот мой Urls.py:
urlpatterns = [
path('get-user-token/', views.UserDetails.as_view()),
path('get-user-details/', views.UserDetails.as_view()),
]
И вот какую ошибку я получаю:
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 82239
Метод .get(…)
[Django-doc] также принимает request
параметр, даже если вы его не используете, так:
class UserDetails(APIView):
# …
def get(self, request):
# …
pass
Я бы настоятельно советовал не делать token
глобальной переменной. Тот же самый веб-сервер может быть использован для другого пользователя, который, таким образом, не прошел аутентификацию (должным образом). Посмотрите раздел Authentication документации Django REST framework для получения дополнительной информации о том, как аутентифицироваться и проверять учетные данные.
Примечание: В Django представления, основанные на классах (CBV), часто имеют суффикс
…View
, чтобы избежать столкновения с именами моделей. Поэтому вы можете переименовать класс представления вUserDetailsView
, вместо.UserDetails