我真的在这个问题上呆了几天了。
虽然我了解这里发生的事情,但我真的不知道最好的解决方法/解决方案。
问题:
我正在尝试使用 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
。
在整个请求生存期内只能执行一次。
所以,这给我留下了两个解决方案:
- 将我的请求有效负载移动到
query params
。 - 将我的请求有效负载移动到
url context
。
我最终使用了两者的混合搭配。
所以,基本上我使用 request.query_params
和 self.context
从请求中获取数据,并相应地更改了我的 URL 和请求结构。