脚本后续更新及迭代将由kkitDeploy项目代替
https://github.com/luckman666/kkitdeploy_server
请大家持续关注kkitDeploy

最近在写新版的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=, default='user.jpg')
phone = models.CharField(max_length=, default='None')
full_name = models.CharField(max_length=, default='你好')
expire = models.IntegerField(default=)
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=) 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 == :
return "超级管理员"
# 查看组内有多少条符合的权限
elif self.groups.count() == :
return "无权限"
else:
gourp_list = []
groups = self.groups.all()
for group in groups:
gourp_list.append(group.name)
if len(gourp_list) == :
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 )

创建用户接口:

 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

序列化函数:

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

 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写后端真是好。能省不少力气,但是也需要不断的分析它各种类的源码以方便我们业务调用。大家可以关注我的公众号获取更多的项目代码和讲解!
波神与你同行哦,加油!!!

rest_framework基于generics.CreateAPIView创建用户的更多相关文章

  1. Oracle基于学习3--Oracle创建用户和授权

    Oracleserver端的操作,如以下一般: 1)       安装Oracleserver软件 2)       创建数据库(安装时自己主动创建) 3)       配置监听(安装时自己主动配置) ...

  2. rest_framework -- mixins&generics

    上面的mixins.generics都是rest_framework里的模块,我们可以继承其中的某些类,达到代码量减少的效果,这里充分体现出了面向对象的继承 一.mixins模块 mixins : f ...

  3. 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)

    搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...

  4. [项目回顾]基于Redis的在线用户列表解决方案

    迁移:基于Redis的在线用户列表解决方案 前言: 由于项目需求,需要在集群环境下实现在线用户列表的功能,并依靠在线列表实现用户单一登陆(同一账户只能一处登陆)功能: 在单机环境下,在线列表的实现方案 ...

  5. 14.7.1.2 MySQL创建用户句法

    14.7.1.2 CREATE USER Syntax 单击此处查看原文 以下是MySQL 5.7.6及以上版本的CREATE USER句法 CREATE USER [IF NOT EXISTS] u ...

  6. 基于JWT标准的用户认证接口实现

    前面的话 实现用户登录认证的方式常见的有两种:一种是基于 cookie 的认证,另外一种是基于 token 的认证 .本文以基于cookie的认证为参照,详细介绍JWT标准,并实现基于该标签的用户认证 ...

  7. SQLServer创建用户登录

    创建用户登录注意事项 密码是区分大小写的. 只有创建SQL Server登录时,才支持对密码预先进行哈希运算. 如果指定MUST_CHANGE,则CHECK_EXPIRATION和 CHECK_POL ...

  8. IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证

    IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证 原文:http://docs.identityserver.io/en/releas ...

  9. mysql创建用户与pymsql模块

    mysql 创建用户及增删改查 创建mysql 用户 with grant option 表示用户不存在自主创建 grant [ select ……,insert ……| all ] on 库名.表名 ...

随机推荐

  1. 【iOS系列】-xib封装使用

    [iOS系列]-xib封装使用 Xib文件可以用来描述某一块局部的UI界面 Xib文件的加载 修改xib文件的大小size(Freeform) 第一: NSArray *objs = [[NSBund ...

  2. 连接sql2008时报错

    最近把公司的项目搭建到本地(周末回家要加班),可是连接后,发现程序后台出错,错误信息:不支持此服务器版本.目标服务器必须是 SQL Server 2000 或更高版本. 本地是SqlServer200 ...

  3. 【hadoop】ssh localhost 免密码登陆(图解)

    假设系统中有用户test,属于用户组test, 1. 首先确认能否不输入口令就用ssh登录localhost: $ ssh localhost 输出如下所示: 2. 如果不输入口令就无法用ssh登陆l ...

  4. Oracle修改序列(Sequence)起始值问题

    Oracle 序列(Sequence)主要用于生成流水号,在应用中经常会用到,特别是作为ID值,拿来做表主键使用较多. 但是,有时需要修改序列初始值(START WITH)时,有同仁使用这个语句来修改 ...

  5. Qt 学习之路 2(19):事件的接受与忽略(当重写事件回调函数时,时刻注意是否需要通过调用父类的同名函数来确保原有实现仍能进行!有好几个例子。为什么要这么做?而不是自己去手动调用这两个函数呢?因为我们无法确认父类中的这个处理函数有没有额外的操作)

    版本: 2012-09-29 2013-04-23 更新有关accept()和ignore()函数的相关内容. 2013-12-02 增加有关accept()和ignore()函数的示例. 上一章我们 ...

  6. 以太坊 EVM内交易执行分析(二)

    接着上次的分析,分析一下run方法是如何执行智能合约的.至于以太币的交易,在上一篇中,已经由分析的那两个函数完成了: 合约的运行是从run开始的,go-ethereum/core/vm/evm.go  ...

  7. bzoj 3232 圈地游戏 —— 01分数规划+最小割建图(最大权闭合子图)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 心烦意乱的时候调这道题真是...越调越气,就这样过了一晚上... 今天再认真看看,找出 ...

  8. Spark 大数据文本统计

    此程序功能: 1.完成对10.4G.csv文件各个元素频率的统计 2.获得最大的统计个数 3.对获取到的统计个数进行降序排列 4.对各个元素出现次数频率的统计 import org.apache.sp ...

  9. asp.net mvc4 不支持EF6

    参考文章:http://www.cnblogs.com/zeusro/p/3403771.html http://q.cnblogs.com/q/40926/ 解决方法是 1.把EF6删除改用EF5. ...

  10. Spring AOP 面向切面编程入门

    什么是AOP AOP(Aspect Oriented Programming),即面向切面编程.众所周知,OOP(面向对象编程)通过的是继承.封装和多态等概念来建立一种对象层次结构,用于模拟公共行为的 ...