rest_framework基于generics.CreateAPIView创建用户

简介: 最近在写新版的devops3.0,被generics.CreateAPIView创建用户密码序列化的问题折磨的欲仙欲死。反复看源码测试,得出下面的流程,这也是做generics.CreateAPIView太少的原因。以后一定要更加细心才是!留存本篇博文便于参考!

最近在写新版的devops3.0,被generics.CreateAPIView创建用户密码序列化的问题折磨的欲仙欲死。反复看源码测试,得出下面的流程,这也是做generics.CreateAPIView太少的原因。以后一定要更加细心才是!留存本篇博文便于参考!


伪代码:


用户model:


需要导入from django.contrib.auth.models import AbstractUser

AbstractUser继承了AbstractBaseUser, PermissionsMixin两个类之前写第二版kkit的时候就是选择了直接继承AbstractBaseUser, PermissionsMixin。


AbstractUser封装了更多的属性可以供我们调用,如果你们觉得没用,那就还是继承上面那两个就行。


class UserProfile(AbstractUser):
    img = models.CharField(max_length=10, default='user.jpg')
    phone = models.CharField(max_length=11, default='None')
    full_name = models.CharField(max_length=11, default='你好')
    expire = models.IntegerField(default=100)
    groups = models.ManyToManyField(
        Group,
        verbose_name=_('groups'),
        blank=True,
        help_text=_(
            'The groups this user belongs to. A user will get all permissions '
            'granted to each of their groups.'
        ),
        related_name="user_set",
        related_query_name="user",
    )
    info = models.CharField(default='', max_length=150)
    class Meta:
        permissions = (
            ('yo_list_user', u'罗列用户'),
            ('yo_list_opsuser', u'罗列运维用户'),
            ('yo_create_user', u'新增用户'),
            ('yo_update_user', u'修改用户'),
            ('yo_delete_user', u'删除用户'),
            ('yo_list_pmngroup', u'罗列权限组'),
            ('yo_create_pmngroup', u'新增权限组'),
            ('yo_update_pmngroup', u'修改权限组'),
            ('yo_delete_pmngroup', u'删除权限组'),
            ('yo_list_permission', u'罗列所有权限')
        )
    def get_group_name(self):
        if self.is_superuser == 1:
            return "超级管理员"
        # 查看组内有多少条符合的权限
        elif self.groups.count() == 0:
            return "无权限"
        else:
            gourp_list = []
            groups = self.groups.all()
            for group in groups:
                gourp_list.append(group.name)
            if len(gourp_list) == 0:
                return ''
            else:
                return "-".join(gourp_list)
    @property
    def is_expire(self):
        return not connect.exists(self.username)
    @is_expire.setter
    def is_expire(self):
        connect.set(self.username, self.expire or 1)


创建用户接口:


path(r'v1/user/create/', user.UserCreateAPI.as_view()),


创建用户函数:

 

因为只是光看创建用户的代码,我删去了自定义的一些验证还有,记录和权限等相关的代码,看看是不是简单的多了。

 

我们继承generics.CreateAPIView,然后重写create方法,将前端传过来的相关用户数据通过request传递过去。

 

然后他会找父类的父类 mixins.CreateModelMixin中的create方法进行实例模型的创建。然后我们再写serializers就差不多了。

 

看到下面的这行了吗?serializer_class = serializers.UserSerializer主要是对前段传递来的数据进行序列化的。嗯!我们再去写这个它。



class UserCreateAPI(generics.CreateAPIView):
    module = models.UserProfile
    serializer_class = serializers.UserSerializer
    queryset = models.UserProfile.objects.all()
    def create(self, request, *args, **kwargs):
            response = super(UserCreateAPI, self).create(request, *args, **kwargs)
            self.get_serializer()
            return  response


序列化函数:

写之前我们先导入之前创建好的模型


from apps.authority.models import UserProfile


然后我们再看写序列化的方法和字段,特别注意我们需要调用set_password方法来保存密码哦!


class UserSerializer(serializers.ModelSerializer):
    group_name = serializers.StringRelatedField(source="get_group_name", read_only=True)
    groups = serializers.PrimaryKeyRelatedField(required=False, many=True, queryset=Group.objects.all())
    class Meta:
        model = UserProfile
        fields = (
            'id', 'is_active', 'phone', 'username', 'full_name', 'group_name', 'groups', 'email',
            'info', 'expire',
        )
        read_only_fields = (
            'id',
        )
    # 保存序列化密码并保存
    def create(self, validated_data):
        obj = super(UserSerializer, self).create(validated_data=validated_data)
        obj.set_password(validated_data.get('password'))
        obj.save()
        return obj

 

好啦!一个创建用户的接口就写完啦。当然在实际中我们需要对其进行权限和账号是否到期等进行相关的限制。因为devops需要时刻采集用户的动作数据,所以呢,我在动作记录上重新写了一张表和相关的数据模板,再写个装饰器进行全局调用。

当然这期我们只聊登录的过程,那就先写这些啦,希望能对看到的各位有所帮助。

 

PS:采用rest_framework写后端真是好。能省不少力气,但是也需要不断的分析它各种类的源码以方便我们业务调用。一起学习一起努力!

相关文章
|
JSON 数据可视化 数据库
vue3+threejs+koa可视化项目——实现登录注册(第三步)
vue3+threejs+koa可视化项目——实现登录注册(第三步)
450 5
|
Web App开发 编解码 安全
视频会议技术 入门探究:WebRTC、Qt与FFmpeg在视频编解码中的应用
视频会议技术 入门探究:WebRTC、Qt与FFmpeg在视频编解码中的应用
1348 4
|
人工智能 前端开发 容器
【前端|CSS系列第4篇】CSS布局之网格布局
【前端|CSS系列第4篇】CSS布局之网格布局
512 0
|
3月前
|
缓存 API 网络架构
DRF视图详解:从基础视图到通用视图实践指南
在 Django REST Framework (DRF) 开发中,视图是处理 HTTP 请求并返回响应的核心组件。DRF 提供了多种视图类型,从基础的 APIView 到功能丰富的通用视图。本文将详细介绍视图的演进过程,帮助理解不同视图的设计思想和使用方法。
149 0
|
7月前
|
安全 前端开发 Android开发
拥抱国产化:转转APP的鸿蒙NEXT端开发尝鲜之旅
本文将要分享的是转转APP在开发全新鸿蒙NEXT端所遇到的一些问题,对比了鸿蒙开发和 Android、iOS 的不同,总结了这次开发过程中的一些经验等等。希望能带给你启发。
292 0
|
缓存 运维 关系型数据库
PolarDB产品使用问题之如何进行PolarDBX的本地部署
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
JSON 缓存 前端开发
Django视图层探索:GET/POST请求处理、参数传递与响应方式详解
Django视图层探索:GET/POST请求处理、参数传递与响应方式详解
|
JSON 前端开发 API
Django API开发实战:前后端分离、Restful风格与DRF序列化器详解
Django API开发实战:前后端分离、Restful风格与DRF序列化器详解
|
前端开发 JavaScript API
深入探讨 React 中 useDispatch 和 useSelector 的使用
深入探讨 React 中 useDispatch 和 useSelector 的使用
661 0
|
中间件 测试技术 调度
设计一个简易版本的分布式任务调度系统
设计一个简易版本的分布式任务调度系统
365 0
下一篇
oss云网关配置