Django - RawPostDataException: вы не можете получить доступ к телу после чтения из потока данных запроса - PullRequest
1 голос
/ 11 июля 2019

Я действительно застрял в этой проблеме на пару дней.

Хотя я понимаю, что здесь происходит, я действительно не знаю лучшего обходного пути / решения для этого.

Проблема:

Я пытаюсь создать конечную точку входа пользователя, используя Django и DRF в целом.

Мой API входа должен поддерживать вход в систему с помощью пароля, а также вход через OTP.

Мой LoginView выглядит так:

    def post(self, request, **kwargs):
    """
    post
        Method to handle user login
    :param request:
    :param args:
    :param kwargs:
    :return:
    """
    request_data = request.data
    login_using_password = request_data.get('login-with-password') is True
    login_using_otp = request_data.get('login-with-otp') is True
    if request_data is not None:
        if all((login_using_password, login_using_otp)):
            raise accounts_exceptions.InvalidLoginRequestError()
        if login_using_password:
            return Response(self._login_with_password(request))
        elif login_using_otp:
            return Response(self._login_with_otp(request))
        raise accounts_exceptions.InvalidLoginRequestError()
    return Response(self._login_with_password(request))

Также мой _login_with_password выглядит так:

    def _login_with_password(self, request, **kwargs):
    """
    _login_with_password
        A utility method to handle login with password
    :param request:
    :return:
    """
    return getattr(ObtainJSONWebToken.as_view()(request=request._request, ), 'data')

Когда я пытаюсь войти, Django жалуется, говоряRawPostDataException You cannot access body after reading from request's data stream

Я использую JWT для проверки подлинности запросов.ObtainJSONWebToken - это представление, предоставляемое DRF-JWT для получения маркеров доступа для проверки подлинности запросов.

Какой обходной путь / решение для этого?

Есть ли лучший способ поддержать такое требование для входа в систему?

Заранее спасибо!

1 Ответ

0 голосов
/ 18 июля 2019

Решено.

Нет конкретного способа решить вышеуказанную проблему.

Джанго запрещает доступ к request.data несколько раз.

Это может быть сделано только один раз за все время существования запроса.

Итак, у меня осталось два решения:

  1. Переместить полезную нагрузку моего запроса на query params.
  2. Переместить полезную нагрузку моего запроса на url context.

В итоге я использовал сочетание и совпадение обоих.

Итак, в основном я использовал request.query_params и self.context для извлечения данных из запроса и соответственно изменил свой URL и структуру запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...