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 提供的视图,用于获取访问令牌以对请求进行身份验证。

对此的解决方法/解决方案是什么?

有没有更好的方法来支持这样的登录要求?

提前感谢!

解决了这个问题。

没有具体的方法可以解决上述问题。

Django 多次禁止访问request.data

在整个请求生存期内只能执行一次。

所以,这给我留下了两个解决方案:

  1. 将我的请求有效负载移动到 query params
  2. 将我的请求有效负载移动到url context

我最终使用了两者的混合搭配。

所以,基本上我使用 request.query_paramsself.context 从请求中获取数据,并相应地更改了我的 URL 和请求结构。

最新更新