欢迎访问宙启技术站
智能推送

UserViewSet实现用户登录与注销功能的示例代码

发布时间:2024-01-07 21:51:49

UserViewSet是Django框架中用于处理用户相关功能的视图集合,包括用户登录和注销功能。下面是一个示例代码,展示了如何使用UserViewSet实现用户登录和注销功能,并提供了使用例子:

# views.py

from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.permissions import AllowAny

from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login, logout

from .serializers import UserSerializer

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = [AllowAny]

    @action(detail=False, methods=['post'])
    def login(self, request):
        username = request.data.get('username')
        password = request.data.get('password')
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return Response({'message': 'User logged in successfully'})
        else:
            return Response({'message': 'Invalid username or password'}, status=400)

    @action(detail=False, methods=['get'])
    def logout(self, request):
        if request.user.is_authenticated:
            logout(request)
            return Response({'message': 'User logged out successfully'})
        else:
            return Response({'message': 'No user logged in'}, status=400)

上面的代码中,我们首先导入了所需的模块和类,包括视图集合类viewsets.ModelViewSet、装饰器action、响应类Response、权限类AllowAny、用户模型类User以及序列化器类UserSerializer

然后创建了一个继承自viewsets.ModelViewSet的类UserViewSet,设置了queryset属性为User.objects.all(),表示查询所有用户;设置了serializer_class属性为UserSerializer,表示使用UserSerializer来处理用户数据序列化和反序列化;设置了permission_classes属性为[AllowAny],表示不需要通过权限验证即可访问该视图集合。

接下来定义了两个@action装饰的方法loginlogout,分别实现用户登录和注销功能。login方法使用post请求,接收usernamepassword参数,通过authenticate函数验证用户身份,如果验证通过则调用login函数登录用户,最后返回登录成功的消息;如果验证失败则返回错误消息。logout方法使用get请求,检查当前是否有用户已登录,如果有则调用logout函数注销用户,最后返回注销成功的消息;如果没有用户登录则返回错误消息。

使用这个UserViewSet的例子如下:

# urls.py

from django.urls import path
from rest_framework.routers import DefaultRouter
from .views import UserViewSet

router = DefaultRouter()
router.register(r'users', UserViewSet, basename='user')

urlpatterns = router.urls

上面的代码中,我们首先导入了所需的模块和类,包括URL配置模块path和默认路由器类DefaultRouter,以及UserViewSet类。

然后创建了一个DefaultRouter实例router,注册了一个URL路径users对应的UserViewSet视图集合,并设置了basenameuser

最后将router.urls添加到项目的URL配置中。

这样就完成了UserViewSet的使用配置,可以通过发送HTTP请求来实现用户登录和注销功能。

用户登录的例子如下:

import requests

url = 'http://localhost:8000/users/login/'
data = {'username': 'test', 'password': 'password'}
response = requests.post(url, data=data)
print(response.json())

这里使用requests库发送一个POST请求到http://localhost:8000/users/login/,传递用户名和密码参数,获取服务器的响应并打印。

用户注销的例子如下:

import requests

url = 'http://localhost:8000/users/logout/'
response = requests.get(url)
print(response.json())

这里使用requests库发送一个GET请求到http://localhost:8000/users/logout/,获取服务器的响应并打印。

以上就是使用UserViewSet实现用户登录和注销功能的示例代码及使用例子。根据自己的具体需求,可以进一步完善和定制这些功能。