DRF 使用令牌身份验证登录/注销可能使用会话身份验证

时间:2021-03-20 06:30:59

标签: python django authentication django-rest-framework

我是 django 的初学者,我正在尝试使用基本和令牌身份验证进行登录/注销视图,参考下面的教程,除了我有自己的基于函数的视图。 https://gutsytechster.wordpress.com/2019/11/12/user-auth-operations-in-drf-login-logout-register-change-password/

我使用 django.contrib.auth 身份验证来检查用户凭据并返回一个令牌而不是我认为在 django 中创建会话的登录方法。 但是本教程要求 auth.logout 方法用于注销,这将需要 HTTPRequest 对象而不是 rest_framework.Request 对象。 但是它适用于注销,当我尝试使用 auth.login 方法时,它给了我以下错误。

request 参数必须是 django.http.HttpRequest 的实例,而不是 rest_framework.request.Request

我的理解是 django.contrib.auth 方法登录、注销适用于会话身份验证和 rest_framework.Request 扩展了 HTTPRequest。

我的问题是 当我在中间件中设置会话身份验证时会发生此错误吗?如果是这样,为什么单独注销有效?不应该因为不引用 HTTPRequest 对象而抛出相同的错误。 任何帮助将不胜感激,因为我会尝试在采用任何其他方法之前充分了解基础知识。

我的观点

@api_view(["POST"])
def login(request):
    serializer = LoginSerializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    user = get_and_authenticate_user(**serializer.validated_data)
    data = AuthUserSerializer(user).data
    #login(request, user)
    return Response(data=data)

def get_and_authenticate_user(username, password):
    user = authenticate(username=username, password=password)
    if user is None:
        raise serializers.ValidationError("Invalid username/password. Please try again!")
    return user

@api_view(["POST"])
def logout_user(request):
    logout(request)
    data = {'success': 'Successfully logged out'}
    return Response(data=data)

0 个答案:

没有答案