Django — слишком много значений для распаковки (ожидается 2)

#python #django

#python #django

Вопрос:

Я пытаюсь создать пользовательский серверный интерфейс, в котором пользователь использует закрытый ключ и секретный ключ для просмотра конечной точки API, которую я создал с помощью Django Rest Framework. Я уже знаю, что это не самое лучшее с точки зрения безопасности, но поскольку конечная точка предназначена только для просмотра данных (у нее есть только метод GET), здесь это не имеет большого значения.

Вот мой код:

 class TokenMiddleware(AuthenticationMiddleware):
    def process_request(self, request):
        try:
            token = request.GET[TOKEN_QUERY_PUBLIC]
            secret = request.GET[TOKEN_QUERY_SECRET]
        except KeyError:
            raise ValidationError(detail="Missing parameter in auth")

        user = auth.authenticate(request, token=token, secret=secret)
        if user:
            # The token is valid. Save the user to the request and session.
            request.user = user
            auth.login(request, user)
        else:
            raise ValidationError(detail="AUTH FAILED")

class TokenBackend(ModelBackend):
    def authenticate(self, request, token=None, secret=None):
        if not token:
            return None

        try:
            publicQuery = User.objects.get(api_keys__public=token)
            if publicQuery != None:
                privateQuery = Api_keys.objects.get(public=token, secret=secret)
                if privateQuery.secret == secret:
                    return User.objects.get(username=publicQuery)
                else:
                    return None
            else:
                return None
        except User.DoesNotExist:
            # A user with that token does not exist
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None
  

И вот Api_keys модель:

 class Api_keys(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    public = models.CharField(max_length=30, blank=True)
    secret = models.CharField(max_length=30, blank=True)
  

Проблема с этим кодом заключается в том, что каждый раз, когда я пытаюсь пройти аутентификацию, я получаю следующую ошибку:

 too many values to unpack (expected 2)
  

Подробнее:

 File "C:UsersuserAppDataLocalProgramsPythonPython38libsite-packagesrest_frameworkrequest.py", line 220, in user
  self._authenticate()
File "C:UsersuserAppDataLocalProgramsPythonPython38libsite-packagesrest_frameworkrequest.py", line 380, in _authenticate
  self.user, self.auth = user_auth_tuple
  

Мой импорт:

 from django.contrib import auth
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
from django.contrib.auth.middleware import AuthenticationMiddleware
from rest_framework.exceptions import ValidationError
from api.models import Api_keys
  

Проблема должна быть после строки auth.login(request, user) , пока я не увижу, что возвращается действительный пользователь. Любая помощь приветствуется!

Комментарии:

1. Исключение «Слишком много значений для распаковки», это исключение означает, что вы пытаетесь распаковать кортеж, но кортеж имеет слишком много значений по отношению к количеству целевых переменных, ваш целевой и исходный кортеж не совпадают

2. Проверьте django-rest-framework.org/api-guide/authentication/#example . Серверные части аутентификации DRF отличаются от обычного django AUTH_BACKENDS . Предполагается, что они возвращают пару пользователь / токен, а не только пользователя!

3. Большое вам спасибо! Итак, в этом случае, что мне нужно передать для аутентификации. вход в систему?

4. @Underoos Проблема в том, что если я не передам запрос на аутентификацию, аутентификация не будет выполнена

5. Похоже, вы путаете django's authenticate() djangorest's authenticate() . Не могли бы вы также опубликовать импорт