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 库名.表名 ...
随机推荐
- 设置清除html5页面缓存
设置清除html5页面缓存 html5端设置 meta 标签: <meta http-equiv="Pragma" content="no-cache" ...
- Timus 1545. Hieroglyphs Trie的即学即用 实现字典提示功能
前面学了Trie,那么就即学即用.运用Trie数据结构来解决这道题目. 本题目比較简单,当然能够不使用Trie.只是多用高级数据结构还是非常有优点的. 题目: Vova is fond of anim ...
- while语句字符串的基本操作
1,编码:对现在通用文字编码成计算机文字,便于储存,传递,交流. 最早的计算机编码是ACSII美国人创建的,包含英文字母,数字,以及特殊符号.总共是128个码位:2**7,因为计算机的底层只能识别:& ...
- JAVA泛型类
泛型是JDK 5.0后出现新概念,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. 泛型类引入的好处不 ...
- What are some advantages of using Node.js over a Flask API?
https://www.quora.com/What-are-some-advantages-of-using-Node-js-over-a-Flask-API Flask is a Python w ...
- netstat --numeric-ports -a -t -p 排查hadoop主从节点是否建立通信
tcp 通信 [root@hadoop2 logs]# netstat --numeric-ports -a -tActive Internet connections (servers and e ...
- W5500EVB UDP模式的測试与理解
之前的博文中已经介绍过W5500EVB 在TCP模式下的两种(Server及Client)传输数据的实现过程,那么传输控制协议中,UDP也是很经常使用的.这样的无连接的协议在很多其它场合为用户提供了便 ...
- HDU2389 Rain on your Parade —— 二分图最大匹配 HK算法
题目链接:https://vjudge.net/problem/HDU-2389 Rain on your Parade Time Limit: 6000/3000 MS (Java/Others) ...
- YTU 2958: 代码填充--雨昕学画画
2958: 代码填充--雨昕学画画 时间限制: 1 Sec 内存限制: 128 MB 提交: 156 解决: 102 题目描述 雨昕开始学画水彩画,老师给雨昕一个形状(Shape)类,雨昕在Sha ...
- Linux设备模型 (4)
<Linux设备模型 (2)>和<Linux设备模型 (3)>主要通过一些简单的实作介绍了kobject.kset.kobj_type.attribute等数据结构的用法,但这 ...