django drf 实现只有超级用户才能注册账号(涉及自定义权限permissions,获取token信息解析token信息)

简介: django drf 实现只有超级用户才能注册账号(涉及自定义权限permissions,获取token信息解析token信息)

编写注册序列化器

和之前的登录序列化器写在一个地方

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

测试自定义权限

使用非超级用户访问

使用超级用户访问

相关文章
|
9月前
|
监控 NoSQL 网络协议
Django 实时通信实战:WebSocket 与 ASGI 全解析(上)
WebSocket 是一种全双工通信协议,支持实时数据传输,适用于聊天、协作、监控等场景。ASGI 是异步 Web 标准,配合 Uvicorn 服务器和 Django Channels,可实现 Django 的 WebSocket 功能,提升实时应用性能。
469 0
|
8月前
|
缓存 监控 中间件
Django中间件自定义开发指南:从原理到实战的深度解析
Django中间件是Web应用的“交通警察”,在请求与响应过程中进行全局处理,适用于身份验证、日志记录、性能监控等功能。本文详解中间件的工作原理、开发步骤及实战案例,帮助开发者掌握自定义中间件的构建方法,提升Django应用的可维护性与扩展性。
470 0
|
9月前
|
Shell 数据库 网络架构
Django+DRF 实战:从异常捕获到自定义错误信息(下)
本文详解了 Django REST Framework 中 ValidationError 的验证流程与优先级,涵盖字段内置验证、自定义验证方法、对象级验证及数据库约束,并通过实战演示如何自定义异常提示信息。
217 1
Django+DRF 实战:从异常捕获到自定义错误信息(下)
|
9月前
|
Python
Django+DRF 实战:自定义异常处理流程
本文详解DRF异常处理流程,包括默认处理机制与自定义异常处理器的实现方法。通过源码分析和实战示例,讲解如何全局捕获并统一返回错误信息,并结合日志记录与友好提示提升项目健壮性。适用于Django进阶开发。
316 4
|
8月前
|
存储 缓存 数据库
Django模型开发全解析:字段、元数据与继承的实战指南
Django模型是业务逻辑与数据库的核心桥梁,本文详解模型开发三大核心:字段类型选择、元数据配置与继承模式应用,涵盖实战技巧与常见问题解决方案,助你构建高效可维护的数据模型。
259 0
|
10月前
|
中间件 数据库 Python
Django实战:自定义中间件实现全链路操作日志记录
Django中间件是一套轻量级插件系统,用于全局处理请求与响应。通过自定义中间件可实现如操作日志记录等功能,支持在请求、视图、响应及异常阶段插入逻辑。本文详解中间件生命周期、编写方式及实战案例。
249 1
|
9月前
|
存储 数据库 Python
Django模型关系:从一对多到多对多全解析
本文详解Django模型关系:一对多(ForeignKey)及多对多(ManyToManyField)关系的定义、操作与优化技巧。同时探讨外键约束的使用场景与权衡策略。
562 0
|
9月前
|
缓存 JSON 应用服务中间件
Django实时通信实战:WebSocket与ASGI全解析(下)
本文将使用 Django Channels 构建一个多用户实时聊天室,并详细介绍如何在生产环境中部署 WebSocket 应用。
294 0
|
9月前
|
数据安全/隐私保护 网络架构 UED
Django+DRF 实战:从异常捕获到自定义错误信息
本文介绍了DRF(Django REST framework)中的异常处理机制,重点讲解了内置异常类ValidationError的使用场景与示例。同时通过用户注册功能的实战演示,展示了如何在序列化器中自定义参数校验规则,并在视图中捕获并返回结构化的错误信息,提升接口的健壮性与用户体验。
199 0
|
Web App开发 移动开发 前端开发
React音频播放器样式自定义全解析:从入门到避坑指南
在React中使用HTML5原生<audio>标签时,开发者常面临视觉一致性缺失、样式定制局限和交互体验割裂等问题。通过隐藏原生控件并构建自定义UI层,可以实现完全可控的播放器视觉风格,避免状态不同步等典型问题。结合事件监听、进度条拖拽、浏览器兼容性处理及性能优化技巧,可构建高性能、可维护的音频组件,满足跨平台需求。建议优先使用成熟音频库(如react-player),仅在深度定制需求时采用原生方案。
558 12

推荐镜像

更多
  • DNS
  • 下一篇
    开通oss服务