码迷,mamicode.com
首页 > 其他好文 > 详细

rest_framework 中的认证

时间:2019-07-03 21:39:13      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:ssi   false   first   nfa   校验   port   uid   总结   mamicode   

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 中的认证

标签:ssi   false   first   nfa   校验   port   uid   总结   mamicode   

原文地址:https://www.cnblogs.com/ZKPython/p/11129174.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!