rest-framework之认证组件

restful认证组件

# 1. 需要写一个认证类,继承BaseAuthentication
class MyAuth(BaseAuthentication):
    # 2. 需要重写authenticate方法,需要传入两个参数(self,request)
    def authenticate(self,request):
        # 方法内部写相应的认证逻辑,以登录为例
        token = request.GET.get('token') # 前后端分离token为随机字符串用作判断登录
        # 从数据库查找token对应的对象
        token_obj = models.Token.objects.filter(token=token).first()
        if token_obj:
            # 有值表示登陆了
            return token_obj.user,token_obj # 需要返回两个返回值 源码中经过处理将第一个值放入request.user中
        else:
        	# 没有值,表示没有登录,抛出异常
            raise AuthenticationFailed('没有登录')

认证组件的使用

  1. 在局部使用:

    需要在视图类中添加属性

    authentication_classes=[MyAuth,]
    
  2. 在全局使用:

    需要在settings.py中配置

    REST_FRAMEWORK={
    			"DEFAULT_AUTHENTICATION_CLASSES":["app01.MyAuths.MyAuth",]
    			}
    
  3. 全局设置后,如果要在局部禁用

    authentication_classes=[]
    

根据源码可以看出:

  • 如果在项目的setting.py中配置了REST_FRAMEWORK,会默认先从项目的setting中取

  • 如果取不到4,才回去drf默认的配置文件中取

  • 如果在视图类中配置了,则优先使用视图类中的

总结:先取视图类中配置的-–-–》项目setting中取-–-–》默认配置

登录接口用户认证示例

  • models.py 模型层

    class User(models.Model):
    	name=models.CharField(max_length=32)
    	pwd=models.CharField(max_length=64)
    	
    class Token(models.Model):
    	user=models.OneToOneField(to='User') #跟User表做一对一关联
    	token = models.CharField(max_length=64)
    
  • views.py 视图层

    class Login(APIView):
        def post(self.request):
                def post(self, request):
            response = {'code': 100, 'msg': '登录成功'}
            name = request.data.get('name')
            pwd = request.data.get('pwd')
    
            try:
                user_obj = models.User.objects.filter(name=name, pwd=pwd).get()
                token = uuid.uuid4()
                models.Token.objects.update_or_create(user=user_obj, defaults={'token': token})
                response['token'] = token
            except ObjectDoesNotExist as e:
                response['code'] = 101
                response['msg'] = '用户名密码错误'
            except Exception as e:
                response['code'] = 102
                response['msg'] = str(e)
            return Response(response)
    

posted @ 2019-07-03 19:24  Lip&Hip  阅读(176)  评论(0)    收藏  举报