rest_framework基于generics.CreateAPIView创建用户
脚本后续更新及迭代将由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创建用户的更多相关文章
- Oracle基于学习3--Oracle创建用户和授权
Oracleserver端的操作,如以下一般: 1) 安装Oracleserver软件 2) 创建数据库(安装时自己主动创建) 3) 配置监听(安装时自己主动配置) ...
- rest_framework -- mixins&generics
上面的mixins.generics都是rest_framework里的模块,我们可以继承其中的某些类,达到代码量减少的效果,这里充分体现出了面向对象的继承 一.mixins模块 mixins : f ...
- 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)
搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...
- [项目回顾]基于Redis的在线用户列表解决方案
迁移:基于Redis的在线用户列表解决方案 前言: 由于项目需求,需要在集群环境下实现在线用户列表的功能,并依靠在线列表实现用户单一登陆(同一账户只能一处登陆)功能: 在单机环境下,在线列表的实现方案 ...
- 14.7.1.2 MySQL创建用户句法
14.7.1.2 CREATE USER Syntax 单击此处查看原文 以下是MySQL 5.7.6及以上版本的CREATE USER句法 CREATE USER [IF NOT EXISTS] u ...
- 基于JWT标准的用户认证接口实现
前面的话 实现用户登录认证的方式常见的有两种:一种是基于 cookie 的认证,另外一种是基于 token 的认证 .本文以基于cookie的认证为参照,详细介绍JWT标准,并实现基于该标签的用户认证 ...
- SQLServer创建用户登录
创建用户登录注意事项 密码是区分大小写的. 只有创建SQL Server登录时,才支持对密码预先进行哈希运算. 如果指定MUST_CHANGE,则CHECK_EXPIRATION和 CHECK_POL ...
- IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证
IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证 原文:http://docs.identityserver.io/en/releas ...
- mysql创建用户与pymsql模块
mysql 创建用户及增删改查 创建mysql 用户 with grant option 表示用户不存在自主创建 grant [ select ……,insert ……| all ] on 库名.表名 ...
随机推荐
- web 界面设计---js设置txt值
<head><meta http-equiv="Content-Type" content="text/html; charset=gb2312&quo ...
- C项目实践--图书管理系统(1)
1.功能需求分析 图书管理系统主要用于对大量的图书信息,包括书名.作者.出版社.出版日期.ISBN(书号)等进行增.删.改.查以及保存等操作.同时也包括对用户的管理,用户包括管理员和普通用户两种权限, ...
- js需要注意的地方
1.function xx(){}定义函数,而对象和函数合写才是方法. 2.typeof返回一个用于识别其运算数类型的字符串.但是需要注意的是,比如typeof null返回的对象是object而不是 ...
- swift中的@objc的作用
转载:https://www.jianshu.com/p/6c5b45d9d042 自动清除冗余代码减小包大小 得益于 Swift 的静态语言特性,每个函数的调用在编译期间就可以确定.因此在编译完成后 ...
- 谈一谈以太坊虚拟机EVM的缺陷与不足
首先,EVM的设计初衷是什么?它为什么被设计成目前我们看的样子呢?根据以太坊官方提供的设计原理说明,EVM的设计目标主要针对以下方面: 简单性(Simplicity) 确定性(Determinism) ...
- .gitignore 使用入门
.gitignore /doc/ 过滤整个文件夹. *.zip 过滤所有.zip文件. /doc/info.txt 过滤某个具体的文件. 这样,push的时候,就不会上传了,git仓库中就没有了. 假 ...
- I.MX6 wpa_cli 使用
/*********************************************************************** * I.MX6 wpa_cli 使用 * 说明: * ...
- 烹调方案 (DP)
传送门 一道非常好的DP.看这个可能会觉得与01背包很像,不过这个的问题在于现做的菜肴会影响到后面的菜肴的价值. 我们在进行01背包DP时,一件物品的价值是不随着其被枚举的位置改变而改变的,但是这道题 ...
- bzoj 2169 连边 —— DP+容斥
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2169 就和这篇博客说的一样:https://blog.csdn.net/WerKeyTom_ ...
- java笔记线程的生命周期图解