Django - RawPostDataException: вы не можете получить доступ к телу после чтения из потока данных запроса

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

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

Проблема:

Я пытаюсь создать конечную точку входа пользователя, используя 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 для получения токенов доступа для аутентификации запросов.

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

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

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


person waqasgard    schedule 11.07.2019    source источник


Ответы (1)


Решил это.

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

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

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

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

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

Я закончил тем, что использовал смесь и матч обоих.

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

person waqasgard    schedule 18.07.2019