Django-RawPostDataException:从请求的数据流读取后,您将无法访问正文

时间:2019-07-11 16:47:09

标签: django python-3.x request jwt

我确实在这个问题上停留了几天。

虽然我了解这里发生的事情,但我真的不知道最好的解决方法/解决方案。

问题:

我通常尝试使用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 :(得分:0)

解决了这个问题。

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

Django禁止多次访问request.data

在整个请求生命周期中只能执行一次。

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

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

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

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