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 = []
原文地址:https://www.cnblogs.com/ZKPython/p/11129174.html
时间: 2024-10-11 16:27:39