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('没有登录')
认证组件的使用
-
在局部使用:
需要在视图类中添加属性
authentication_classes=[MyAuth,] -
在全局使用:
需要在settings.py中配置
REST_FRAMEWORK={ "DEFAULT_AUTHENTICATION_CLASSES":["app01.MyAuths.MyAuth",] } -
全局设置后,如果要在局部禁用
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)

浙公网安备 33010602011771号