首页 > 其他 > 详细

rest-framework之认证组件

时间:2019-07-03 23:22:13      阅读:116      评论:0      收藏:0      [点我收藏+]

认证简介

只有认证通过的用户才能访问指定的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配置文件中取
-如果用户在视图类中配置了某个,先去用户配置的取

 

rest-framework之认证组件

原文:https://www.cnblogs.com/zhengyuli/p/11129366.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!