• 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配置文件中取
    -如果用户在视图类中配置了某个,先去用户配置的取

  • 相关阅读:
    NOIP模拟 10
    无聊的 邮递员 插头dp
    类实例化对象可以访问静态(static)方法,但是不能访问静态属性。
    PHP——抽象类与接口的区别
    工厂模式
    win10 专业版 git bash 闪退问题终极解决方案
    git基本的使用原理
    排序算法-插入排序
    如何进行CodeReview
    php中的各种http报错的报错的状态码的分析
  • 原文地址:https://www.cnblogs.com/zhengyuli/p/11129366.html
Copyright © 2020-2023  润新知