rest-framework之认证组件

认证简介

只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件

源码分析

首先要找到认证组件

这里的request是新的request,这里的user是一个方法,包装成了数据属性

然后进入user看一下user是在Request类里的所以先要导入

from rest_framework.request import Request

authenticators是Request类初始化传过来的

然后再找Request是在哪里实例化的  是在封装的时候实例化的

这里的self就是自己里面有authenticators方法

现在视图里面

 

用户登录认证

model.py

class User(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
    user_type = models.IntegerField(choices=((1,'超级用户'),(2,'普通用户'),(3,'穷逼用户')))

class UserToken(models.Model):
    user = models.OneToOneField(to='User')
    token = models.CharField(max_length=64)

OneToOneField其实就是ForeignKey里面加了一个unique=True 唯一性

view.py

class Login(APIView):
    def post(self,request):
        response = {'code':100,'msg':'登录成功'}
        name = request.data.get('name')
        pwd = request.data.get('password')
        #get获取一条或有且只有一条的数据不会报错,否则抛异常
        try:
            user =models.User.objects.filter(name=name,password=pwd).get()
            #登录成功token表存数据,如果有一条数据就更新token,没有就添加
            token = uuid.uuid4()
            #这里面user是先把这用户名查出来,update_or_create如果能查到更新,查不到就写进去
            models.UserToken.objects.update_or_create(user=user,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)

 

postman这里最后面一定要加斜杆,不加就出错了

django中请求路径带斜杠和不带斜杠
-CommonMiddleware中间件

token认证是否登录

写一个认证类,继承BaseAuthentication

class MyAuth(BaseAuthentication):
    def authenticate(self,request):
        #这里可以写认证的逻辑
        #用户登录之后才能访问所有的图书
        #拿出请求路径token值,一般放在头当中安全些,放在请求头取值就要用meta
        token = request.GET.get('token')
        token_obj = models.UserToken.objects.filter(token=token).first()
        if token_obj:
            #有值表示登录了
            return
        else:
            #没有值表示没有登录,抛异常捕获
            raise AuthenticationFailed('您没有登录')

    def authenticate_header(self,a):
        pass

token不存在

如果没加authenticate_header会报错们不能返回异常捕获信息,也可以不写但是要导入

from rest_framework.authentication import BaseAuthentication

 

token存在

源码部分

 

 

 

如果再写一个视图类也要有认证功能就只要加上

authentication_classes = [MyAuth,]

局部使用

 全局使用

配置好视图里面就可以不用写了

REST_FRAMEWORK={
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.MyAuths.MyAuth",]
}

但是这样登录视图就也要认证了!

局部禁用

直接为空列表就行了

源码部分

如果没有配authentication_classes的话就是会父类里面找也就是APIview里面找

如果在项目的setting.py中配置了REST_FRAMEWORK,默认先从项目的setting中取
-如果取不到,才去默认的drf配置文件中取
-如果用户在视图类中配置了某个,先去用户配置的取

 

posted on 2019-07-03 21:56  ZY_LO  阅读(209)  评论(0编辑  收藏  举报

导航