我确实在这个问题上停留了几天。
虽然我了解这里发生的事情,但我真的不知道最好的解决方法/解决方案。
问题:
我通常尝试使用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提供的用于获取访问令牌以认证请求的视图。
此问题的解决方法/解决方案是什么?
是否有更好的方法来支持这种登录要求?
谢谢!
答案 0 :(得分:0)
解决了这个问题。
没有解决上述问题的具体方法。
Django禁止多次访问request.data
。
在整个请求生命周期中只能执行一次。
所以,这给了我两个解决方案:
query params
。url context
。我最终使用了两者的混合搭配。
因此,基本上,我使用request.query_params
和self.context
从请求中获取数据,并相应地更改了URL和请求结构。