编写注册序列化器
和之前的登录序列化器写在一个地方
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
测试自定义权限
使用非超级用户访问
使用超级用户访问