1. 什么是drf 框架的认证组件: auth 就等于是jango中的Auth模块,Auth是自带session信息,但是 drf的认证组件可以自定义token携带过去,去判断用的
2.如何实现认证呢?
from rest_framework.authentication import BaseAuthentication from app01 import models from rest_framework.exceptions import AuthenticationFailed class MyAuthetication(BaseAuthentication): #重写这个方法 def authenticate(self,request): #认证相关的东西 #如果token信息放到请求头中,如何取? # request._request.META # token=request.META.get('token') # 校验该次请求是否携带正确的token #取出token token=request.GET.get('token') #校验该次请求是否携带正确的token ret=models.UserToken.objects.filter(token=token).first() if ret: #正常通过认证的用户 #ret.user 当前登录用户 return ret.user,token # return None else: #没有登录或者非法用户 raise AuthenticationFailed('您没有通过认证')
3. 如何在登录的时候加载认证信息处理是否是正常的用户
#写登录接口 class Login(APIView): #全局使用的局部禁用 authentication_classes = [] def post(self,request): response={'status':100,'msg':None} name=request.data.get('name') pwd=request.data.get('pwd') #去数据库校验该用户是否存在 user=models.User.objects.filter(name=name,pwd=pwd).first() if user: #正常用户登录成功 #返回一个唯一的随机字符串 token=uuid.uuid4() #把生成的随机字符串存到数据库中 # 这样不行,因为每次登录都会新插入一条 # models.UserToken.objects.create(user=user,token=token) # 先去数据库中查询,如果当前用户存在记录,更新token,如果不存在,新增一条 # 根据user取查询,如果查到数据,更新defaults中的数据,如果查不到,新增一条数据 ret=models.UserToken.objects.update_or_create(user=user,defaults={'token':token}) response['msg']='登录成功' response['token']=token else: #用户名或密码错误 response['status'] = 101 response['msg'] = '用户名或密码错误' return Response(response)
4. 如何全局使用呢?
# 认证的全局配置 REST_FRAMEWORK={ 'DEFAULT_AUTHENTICATION_CLASSES':['app01.MyAuth.MyAuthetication',], }
5. 如何全局禁用,局部使用呢?
#写登录接口 class Login(APIView): #全局使用的局部禁用 authentication_classes = [MyAuthetication] def post(self,request):