编写注册序列化器
和之前的登录序列化器写在一个地方
from django.contrib.auth import get_user_model User = get_user_model() class RegisterSerializers(serializers.ModelSerializer): '''增加用户的序列化器''' class Meta: # 指定模型类 model = User # 指定模型字段 fields = ['username','password','mobile','email'] # 为序列化器字段添加约束 extra_kwargs = { 'username': { 'max_length': 20, 'min_length': 3 }, 'password': { 'max_length': 20, 'min_length': 6, 'write_only': True }, } def create(self, validated_data): '''重写create方法实现,将密码加密后保存''' # 将密码加密后保存 user = User.objects.create_user(**validated_data) return user
编写注册视图
from django.contrib.auth import get_user_model from rest_framework import status from rest_framework.response import Response from rest_framework.views import APIView from rest_framework_simplejwt.views import TokenViewBase from apps.users.permissions import IsSuperUser from .serializers import MyTokenSerializer, RegisterSerializers User = get_user_model() class RegisterView(APIView): #使用权限(permission_classes = (IsSuperUser,)),IsSuperUser这是自定义权限,只允许超级用户访问 #(IsSuperUser,)这样才是元组,(IsSuperUser)这个不是 permission_classes = (IsSuperUser,) def post(self,request): re=RegisterSerializers(data=request.data) username=request.data['username'] try: if re.is_valid(): re.save() return Response(data=re.data, status=status.HTTP_200_OK) return Response(data=re.errors, status=status.HTTP_400_BAD_REQUEST) except: # 虽然报错了,但是数据确实落库了,只需要判断下前端传的用户名在数据库里面能找到就行 user=User.objects.filter(username=username).first() if user: return Response({'msg':'注册成功','username':username},status=status.HTTP_200_OK) return Response({'msg':'注册失败'},status=status.HTTP_400_BAD_REQUEST)
配置二级路由,一级路由和之前登录一样
测试注册视图
通过性测试
失败测试
自定义权限
通过解析token信息在数据库查询是否属于超级用户来判断是否可以访问这个接口
import base64 from rest_framework import permissions from django.contrib.auth import get_user_model User = get_user_model() def get_token_user_id(token_raw): token = token_raw.replace('Bearer ', '') token = token.split('.') # base64加密需要是4的整数倍,不够的话要用=补齐 user_info_mi = token[1] print(len(user_info_mi)) if len(user_info_mi) % 4 == 0: user_info_mi = user_info_mi else: user_info_mi = user_info_mi + '=' user_info = base64.b64decode(user_info_mi).decode("utf-8") print(user_info) #字符转下字典 user_info = eval(user_info) return user_info['user_id'] class IsSuperUser(permissions.BasePermission): '''只有管理员才能操作注册接口''' def has_permission(self, request, view): """ :param request: 请求参数信息 :param view: #当前访问的视图 :return: bool """ # 去headers里面拿到token的信息 token_raw = request.headers.get('Authorization') is_superuser = User.objects.filter(id=get_token_user_id(token_raw)).first().is_superuser print(is_superuser) if is_superuser: return True return False
测试自定义权限
使用非超级用户访问
使用超级用户访问