rest_framework 中的认证 前戏简单源码 OneToOneField与ForeignKey 其实在源码里面OneToOneField是继承ForeignKey,然后OneToOneField与ForeignKey唯一不同的就是OneToOneField在自己的__init__里面写了kwargs[‘un
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 = []