脚本后续更新及迭代将由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. my-small.cnf my-medium.cnf my-large.cnf my-huge.cnf

    my-small.cnf my-medium.cnf my-large.cnf my-huge.cnf 是 MySQL 默认的几个配置文件.针对不同配置的服务器可以使用不同的配置文件,将你需要的那一个 ...

  2. Codeforces Round #310 (Div. 1) C. Case of Chocolate (线段树)

    题目地址:传送门 这题尽管是DIV1的C. . 可是挺简单的. .仅仅要用线段树分别维护一下横着和竖着的值就能够了,先离散化再维护. 每次查找最大的最小值<=tmp的点,能够直接在线段树里搜,也 ...

  3. VMware一些使用心得

    这段时间VMware workstation用得较多,装了好几个虚拟机,有win2003,win2008,win7,还分32位,64位.装了这么多,要么是用于安装一些软件,比如oracle12c,因为 ...

  4. .NET的委托和匿名函数应用一例

    闲话休提,大家都是成年人,直接上代码.有代码有J8: delegate string dlgGetTotal(); void TongJi() { dlgGetTotal getTotalInt = ...

  5. SetLocalTime API函数设置本地时间(DateTimeToSystemTime函数,把TDateTime转换成TSystemTime)

    procedure setLocalDateTime(Value: TDateTime);var  lSystemDateTime: TSystemTime;begin  DateTimeToSyst ...

  6. XMU 1606 nc与滴水问题 【模拟】

    1606: nc与滴水问题 Time Limit: 1000 MS  Memory Limit: 64 MBSubmit: 85  Solved: 27[Submit][Status][Web Boa ...

  7. Lightoj 1007 - Mathematically Hard

    1007 - Mathematically Hard    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 6 ...

  8. idea新建springmvc+spring+mybaties项目1

    1,点击file,选择module,新建项目 2,选择maven -- >maven-archetype-webapp 3,输入GroupId,ArtifactId,点击next 4,选择本地m ...

  9. java 防止表单重复提交(serlvet)

    java 防止表单重复提交 ---------FormServlet.java-------------- protected void doGet(HttpServletRequest reques ...

  10. 牛客练习赛13D:幸运数字Ⅳ(康托展开) F:关键字排序

    链接:https://www.nowcoder.com/acm/contest/70/D 题目: 定义一个数字为幸运数字当且仅当它的所有数位都是4或者7. 比如说,47.744.4都是幸运数字而5.1 ...