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

Posted

技术标签:

【中文标题】Django - RawPostDataException:从请求的数据流中读取后,您无法访问正文【英文标题】:Django - RawPostDataException: You cannot access body after reading from request's data stream 【发布时间】:2019-11-21 10:50:51 【问题描述】:

这几天我真的被这个问题困住了。

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

问题:

我正在尝试使用 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】:

解决了这个问题。

上面的问题没有具体的解决办法。

Django 不允许多次访问request.data

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

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

    将我的请求负载移动到query params。 将我的请求负载移动到url context

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

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

【讨论】:

以上是关于Django - RawPostDataException:从请求的数据流中读取后,您无法访问正文的主要内容,如果未能解决你的问题,请参考以下文章

Django之路

Django系列

django 错误

mac电脑安装django ,运行django报错解决

Django 大神带你飞系列~走进Django

django的文档