DRF登录认证组件

DRF登录认证组件

1.写一个登录认证类(类名随意,类中的方法名固定)

from app01 import models
from rest_framework import exceptions
from rest_framework.authentication import BaseAuthentication


class Auth(BaseAuthentication):

    def authenticate(self,request):
        token = request.query_params.get('token')
        res = models.Token.objects.filter(token=token).first()
        if res:
            #放回的res.user就是将user添加到request中user中,res会添加到request的auth中
            return res.user,res
        else:
            raise exceptions.APIException('您还没有登录!')

2.全局使用

​ 在setting中配置

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': ['app01.AuthAPI.Auth']
}

​ 每次走视图行数之前都会先走认证类

3.局部禁用(在视图类中添加)

authentication_classes = [ ]

例如:

​ 这样Login视图类就不会使用Auth认证

class Login(APIView):
    authentication_classes = [ ]
    def post(self,request):
        user = models.User.objects.filter(name=request.data.get('name'),pwd=request.data.get('pwd')).first()
        if not user:
            return JsonResponse({'msg':'用户名或者密码错误!'})
        else:
            token = uuid.uuid4()
            models.Token.objects.update_or_create(user=user,defaults={'token':token})
            return JsonResponse({'msg':'登录成功!','token':token})

4.局部使用

​ 如果要实现局部使用就不能在setting中配置了,

​ 在要使用的视图类中添加如下字段

authentication_classes = [Auth, ]

​ 例如:

class Login(APIView):
    authentication_classes = [Auth, ]
    def post(self,request):
        user = models.User.objects.filter(name=request.data.get('name'),pwd=request.data.get('pwd')).first()
        if not user:
            return JsonResponse({'msg':'用户名或者密码错误!'})
        else:
            token = uuid.uuid4()
            models.Token.objects.update_or_create(user=user,defaults={'token':token})
            return JsonResponse({'msg':'登录成功!','token':token})
posted @ 2018-12-13 16:36  周建豪  阅读(1148)  评论(0编辑  收藏  举报