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_params
和self.context
从请求中获取数据并相应地更改了我的URL 和请求结构。
【讨论】:
以上是关于Django - RawPostDataException:从请求的数据流中读取后,您无法访问正文的主要内容,如果未能解决你的问题,请参考以下文章