Nano Hash - криптовалюты, майнинг, программирование

Django JWT-аутентификация с запросом PUT

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

{
    "username": [
        "This field is required."
    ],
    "password": [
        "This field is required."
    ]
}

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

команда curl не работает

curl -H "Authorization: JWT <token>" -X PUT  http://localhost:8000/user/3/ -d '{"first_name":"curl_test"}'

Команда curl работает

curl -H "Authorization: JWT <token>" -X GET  http://localhost:8000/user/3/

ЗАМЕТИТЕ ДРУГОЙ метод. мой views.py (класс UserDetails)

class UserDetail(APIView):
    permission_classes = (IsOwner, IsAuthenticated)
    """
    Retrieve, update or delete a user instance.
    """

    def get_object(self, pk):
        try:
            return User.objects.get(pk=pk)
        except User.DoesNotExist:
            raise Http404


    def get(self, request, pk, format=None):
        user = self.get_object(pk)
        serializer = UserSerializer(user)
        return Response(serializer.data)

    def put(self, request, pk, format=None):
        user = self.get_object(pk)
        serializer = UserSerializer(user, data=request.data)
        if serializer.is_valid():
            serializer.save()
            user = Profile.objects.get(id=pk)
            user.profile.updated = timezone.now()
            user.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk, format=None):
        user = self.get_object(pk)
        user.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

мой settings.py

REST_FRAMEWORK = {

    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',

    ),
    'DEFAULT_PARSER_CLASSES': (
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
        'rest_framework.parsers.JSONParser',

    )
}

JWT полностью работает, при отправке старого токена по запросу, который я получаю, срок действия подписи истек, но когда я помещаю последний токен, я получаю имя пользователя / пароли - обязательные поля.


  • попробуйте использовать patch метод 18.09.2017
  • Та же ошибка. JWT говорит, что я должен указать имя пользователя и пароль и игнорировать токен в заголовке 18.09.2017
  • добавить json данных, которые вы отправляете на сервер, 18.09.2017
  • Вы хотите, чтобы я включил команду curl, которую я отправил? Я сделаю это, когда мой ноутбук закончит обновление 18.09.2017
  • да, добавьте это к своему вопросу, пожалуйста 18.09.2017
  • Похоже, вы отправляете запрос конечной точке, которая ожидает получить имя пользователя и пароль в формате JSON. Совет по PATCH запросу звучит многообещающе. Но если не получится - проверьте, правильно ли настроены DRF / JWT. Причиной может быть также забытое (не включенное) промежуточное ПО или серверная часть аутентификации. 18.09.2017
  • Думаю, я уже несколько раз подчеркивал это. любой запрос GET с заголовком JWT РАБОТАЕТ, любой запрос PUT (например, для другой транзакции таблицы) РАБОТАЕТ. конфликт возникает, когда я пытаюсь выполнить запрос PUT и обновить имя пользователя, он запросит имя пользователя и полностью игнорирует ЗАГОЛОВОК, объясните, пожалуйста, как это бэкэнд аутентификации, я использовал только классы по умолчанию. 18.09.2017
  • Я пробовал использовать метод PATCH, я получаю ту же ошибку, что и запрос PUT 18.09.2017

Ответы:


1

Ваш сериализатор пользователя применяет данные всех полей, используйте partial=True, чтобы разрешить частичные обновления:

serializer = UserSerializer(user, data={'username': u'test'}, partial=True)
17.09.2017
  • Я попробую, как только закончу обновлять свой ноутбук 18.09.2017
  • Я просто попробовал, проблема не в частичном обновлении или полном обновлении, у меня такой же точный код в другой таблице, где нет полей имени пользователя / паролей, и использование запроса PUT для него нормально с JWT. проблема, похоже, связана с rest-framework-jwt, ему нужны имя пользователя и пароль, хотя заголовок токена включен. Получить / проверить / обновить токен работает без проблем. 18.09.2017
  • Как узнать, что возвращенная ошибка исходит от JWT, а не UserSerializer? Трассировки стека? 18.09.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..