django - DRF 中的登录视图

Ofe*_*mon 2 python django login django-rest-framework

我的 Django 代码中有一个寄存器视图,它工作正常:

在 Django 休息框架中工作,

class UserViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    @list_route(methods=['post'])
    def register(self, request):
        serializer = UserSerializer(data=request.DATA)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)

现在我想添加一个登录视图以让用户登录,我写了这样的东西,不确定这个:

@list_route(methods=['post'])
    def login(self, request):
        username = request.POST['username']
        password = request.POST['password']

        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                return Response(status=status.HTTP_200_OK)
            else:
                return Response(status=status.HTTP_404_NOT_FOUND)
        else:
            return Response(status=status.HTTP_401_UNAUTHORIZED)
Run Code Online (Sandbox Code Playgroud)

几个问题:

  • 看起来好吗?
  • 而且,我应该如何发布到这个视图?到我用 json 发布的注册视图,它工作正常。带有用户名和密码的 json 也可以在这里工作吗?

cha*_*ndu 5

您使用 DRF 的登录方法不正确。对于登录,您还没有使用序列化程序。您可以通过这些 api 进行登录、注销等以获得清晰的理解

Djoser Djoser 库提供了一组视图来处理基本操作,例如注册、登录、注销、密码重置和帐户激活。该包使用自定义用户模型,并使用基于令牌的身份验证。这是一个随时可用的 Django 身份验证系统的 REST 实现。

django-rest-auth Django-rest-auth 库提供了一组 REST API 端点,用于注册、身份验证(包括社交媒体身份验证)、密码重置、检索和更新用户详细信息等。通过拥有这些 API 端点,您的客户端应用程序例如因为 AngularJS、iOS、Android 和其他可以通过 REST API 独立地与您的 Django 后端站点通信以进行用户管理。


小智 5

您的 *register 正在使用 @list_route 模式监听 post 方法,并且您还想将您的 *login 绑定到 @list_route 再次发布?!?

这是不可能的,如果你问我我更喜欢用 APIView 类型实现我的身份验证类

像这样创建您的登录名(views.APIView):


class LoginView(views.APIView):
    def post(self, request, format=None):
        data = request.data

        username = data.get('username', None)
        password = data.get('password', None)

        user = authenticate(username=username, password=password)

        if user is not None:
            if user.is_active:
                login(request, user)

                return Response(status=status.HTTP_200_OK)
            else:
                return Response(status=status.HTTP_404_NOT_FOUND)
        else:
            return Response(status=status.HTTP_404_NOT_FOUND)
Run Code Online (Sandbox Code Playgroud)