Django Rest Framework 中的用户通过会话注销

4 django session angularjs django-rest-framework

我有一个应用程序,前端由 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);
  }
}
Run Code Online (Sandbox Code Playgroud)
class ProfileSettingsViewset(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, viewsets.GenericViewSet):
    @action(detail=False, methods=['post'])
    def logout(self, request):
        #???
        return Response(status=status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)

也就是说,用户实际上并未注销。

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

vor*_*ack 5

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

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

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)
Run Code Online (Sandbox Code Playgroud)

如果您使用会话身份验证后端,则必须使用 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)
Run Code Online (Sandbox Code Playgroud)

然后在网址中:

urlpatterns = [
    ...
    url(r'^logout/', Logout.as_view()),
]
Run Code Online (Sandbox Code Playgroud)

在你的角度组件中,在删除清除本地存储内容之前必须调用对此视图的Ajax请求

  • 所有 cookie 通过每个请求发送到服务器。您可以使用 HttpClient 通过 Angular 调用 Ajax 请求。请参阅链接“https://angular.io/guide/http” (2认同)