【问题标题】:User logout by session in Django Rest FrameworkDjango Rest Framework中的会话用户注销
【发布时间】:2020-02-05 13:25:21
【问题描述】:

我有一个应用程序,前端由 Angular 6 编写,后端由 Django Rest Framework 编写。

使用以下代码在前端实现用户注销:

@Component({
  selector: 'app-logout-modal',
  templateUrl: './logout-modal.component.html',
  styleUrls: ['./logout-modal.component.scss']
})
export class LogoutModalComponent implements OnInit {

  constructor(public thisDialogRef: MatDialogRef<LogoutModalComponent>,
              private router: Router,
              @Inject(MAT_DIALOG_DATA) public data: any) {
  }

  ngOnInit() {
  }
  logoutAndClose(): void {
    localStorage.clear();
    this.thisDialogRef.close();
    this.router.navigateByUrl(RouteUrls.Login);
  }
}
class ProfileSettingsViewset(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, viewsets.GenericViewSet):
    @action(detail=False, methods=['post'])
    def logout(self, request):
        #???
        return Response(status=status.HTTP_200_OK)

也就是说,用户实际上并没有退出。

如何在 DRF 上按会话实现用户注销?

【问题讨论】:

    标签: angularjs django session django-rest-framework


    【解决方案1】:

    要注销用户,您必须实现一个视图集。

    如果您使用基于令牌的身份验证,只需删除令牌

    from rest_framework import status
    from rest_framework.response import Response
    from rest_framework.views import APIView
    
    class Logout(APIView):
        def get(self, request, format=None):
            # simply delete the token to force a login
            request.user.auth_token.delete()
            return Response(status=status.HTTP_200_OK)
    

    如果您使用会话身份验证后端,您必须使用 Django 后端注销用户,如下所示:

    from rest_framework import status
    from rest_framework.response import Response
    from rest_framework.views import APIView
    from django.contrib.auth import logout
    
    class Logout(APIView):
        def get(self, request, format=None):
            # using Django logout
            logout(request)
            return Response(status=status.HTTP_200_OK)
    

    然后在网址中:

    urlpatterns = [
        ...
        url(r'^logout/', Logout.as_view()),
    ]
    

    在你的 Angular 组件中必须调用 Ajax 请求到这个视图,然后再删除清除本地存储内容

    【讨论】:

    • 谢谢。是的,我根据session 实现注销。所需的session_id 会自动转到后端(到DRF 视图)吗?如何将angular中的ajax请求调用到这个view
    • 所有 cookie 由每个请求发送到服务器。您可以使用 HttpClient 使用 Angular 调用 Ajax 请求。见链接https://angular.io/guide/http
    猜你喜欢
    • 2023-03-27
    • 2011-06-26
    • 2019-02-20
    • 1970-01-01
    • 2015-03-07
    • 2015-08-31
    • 2018-08-20
    • 2019-01-05
    • 1970-01-01
    相关资源
    最近更新 更多