rest_framework 中的认证

Posted zkpython

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rest_framework 中的认证相关的知识,希望对你有一定的参考价值。

rest_framework 中的认证

前戏简单源码

OneToOneField与ForeignKey

其实在源码里面OneToOneField是继承ForeignKey,然后OneToOneField与ForeignKey唯一不同的就是OneToOneField在自己的__init__里面写了kwargs[‘unique‘] = True 就是确保字段的唯一性,这样就形成了一对一。

技术图片

了解了源码以后呢,其实我们可以不用一对一字段 直接可以用ForeignKey 里面写一个unique=True就可以实现一对一了,但是一般不推荐这么用,别人写好了就用别人的就知道了,如下图。
技术图片

简介

只有登录成功的用户才能看到里面所有相关我东西,这里的话我们需要用到rest_framework的认证

局部使用:

models.py

class User(models.Model):
    name=models.CharField(max_length=32)
    pwd=models.CharField(max_length=64)
    user_type=models.IntegerField(choices=((1,"超级管理员"),(2,"普通管理员"),(3,"2b用户")),default=3)
#跟User表做一对一关联
class Token(models.Model):
    user=models.OneToOneField(to='User')
    token = models.CharField(max_length=64)

在app下面新建一个py的文件,然后在新建的这个.py文件中创建一个类

from rest_framework.authentication import BaseAuthentication
from app01 import models
from rest_framework.exceptions import AuthenticationFailed
from rest_framework.permissions import BasePermission

class MyAuth(BaseAuthentication):
    def authenticate(self, request):
        token = request.GET.get('token')
        token_obj = models.Token.objects.filter(token=token).first()
        if token_obj:
            return token_obj.user, token_obj
        else:
            raise AuthenticationFailed('亲,你还未登录呢')
            
  class MyPermision(BasePermission):
    # 需要打印中文错误信息 加一个message
    message = '不是超级用户,查看不了'
    def has_permission(self,request,view):
        if request.user.user_type==1:
            return True
        else:
            return False

view.py

class Book(APIView):
    # 这个地方加在这里的话就是会对整个Book做校验
    authentication_classes = [MyAuth, ]
    def get(self, request):
        print(request.user.name)
        return Response('图书列表')


class Login(APIView):
    def post(self, request):
        response = 'code': 100, 'msg': '登录成功'
        name = request.data.get('name')
        pwd = request.data.get('pwd')
        user_type = request.data.get('user_type')
        try:
            print(name, pwd)
            user = models.User.objects.filter(name=name, pwd=pwd).get()
            token = uuid4()
            models.Token.objects.update_or_create(user=user, defaults='token': token)
            response['token'] = token
        except Exception as e:
            print(e)
        return Response(response)

总结:局部使用,只需要在视图类里加入:

authentication_classes = ["需要加认证的类", ]

全局认证需要在settings中加入:

REST_FRAMEWORK=
    "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",]

注意:如果加入了全局认证,有些不需要的时候可以加入以下一段代码

# 让这个列表为空就行,就没有加入认证
authentication_classes = []

以上是关于rest_framework 中的认证的主要内容,如果未能解决你的问题,请参考以下文章

rest_framework-认证-总结完结篇

三大认证组件

REST_FRAMEWORK加深记忆-加了用户登陆认证,自定义权限的API接口

auth认证组件

登录认证

python Django Rest_Framework框架 认证权限限流功能组件详解(图文并茂版)