tppAPI实例

https://gitee.com/zhanzhaoxiang/tppAPI.git

user/serializers.py

import re
from datetime import datetime, timedeltafrom rest_framework import serializers
from rest_framework.validators import UniqueValidatorfrom user.models import User, VerifyCodeclass SmsSerializer(serializers.Serializer):phone = serializers.CharField(required=True, max_length=11, min_length=11, error_messages={'max_length': '手机号11位','min_length': '手机号11位',})def validate_phone(self, phone):# 验证手机号有没有注册过if User.objects.filter(phone=phone).exists():raise serializers.ValidationError('此手机号已注册')if not re.match(r'1\d{10}', phone):raise serializers.ValidationError('手机号格式错误')return phoneclass RegisterSerializer(serializers.ModelSerializer):code = serializers.CharField(required=True, max_length=4, min_length=4, error_messages={'required': '必需输入验证码','max_length': '验证码4位','min_length': '验证码4位'}, write_only=True)# 用户名验证方法一种username = serializers.CharField(required=True, allow_blank=False,validators=[UniqueValidator(queryset=User.objects.all(), message='此用户名已被占用')])repassword = serializers.CharField(write_only=True, style={'input_type': 'password'})class Meta:model = Userfields = ['username', 'password', 'repassword', 'phone', 'code']def validate_code(self, code):# 验证码确认verifycodes = VerifyCode.objects.filter(phone=self.initial_data['phone']).order_by('update_time')if verifycodes:verifycode = verifycodes.first()# 设置一个过期时间,现在的时间减去有效时间time_delta = datetime.now() - timedelta(minutes=10)if time_delta > verifycode.update_time:raise serializers.ValidationError('验证码过期,请重新发送')if verifycode.code != code:raise serializers.ValidationError('验证码错误')else:raise serializers.ValidationError('请发送验证码')return codedef validate(self, attrs):# 验证两次密码是否一致if attrs['password'] != attrs['repassword']:raise serializers.ValidationError('密码不一致')# 确认密码和验证码不放入数据库,先删掉再创建用户del attrs['repassword']del attrs['code']return attrs# def validate_username(self, username):#     # 验证用户名是否重复的一种方法#     if User.objects.filter(username=username).exists():#         raise serializers.ValidationError('此用户名已注册')#     return usernameclass UserSerializer(serializers.ModelSerializer):class Meta:model = Userfields = ['username', 'password', 'phone']

user/view.py

from django.contrib.auth.hashers import make_password
from django.shortcuts import render# Create your views here.
from rest_framework.authentication import BasicAuthentication, SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import CreateModelMixin, UpdateModelMixin, RetrieveModelMixin
from rest_framework_simplejwt.authentication import JWTAuthenticationfrom user.models import VerifyCode, User
from user.serializers import SmsSerializer, RegisterSerializer, UserSerializer
from utils.send_sms import send_smsclass SmsViewSet(CreateModelMixin, GenericViewSet):serializer_class = SmsSerializerdef create(self, request, *args, **kwargs):# 获取手机号serializer = self.get_serializer(data=request.data)serializer.is_valid(raise_exception=True)phone = serializer.validated_data['phone']# 发送验证码json = send_sms(phone)if json.get('code') == 200:# 保存到数据库vc = VerifyCode.objects.create(phone=phone, code=json.get('obj'))if vc:return Response(serializer.data, status=200)else:return Response({'msg': '验证码发送失败', 'status': json.get('obj')}, status=200)class UserViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, GenericViewSet):"""实现用户注册,登录,更新"""queryset = User.objects.all()# serializer_class = RegisterSerializer# 局部添加定制身份权限认证# 设置需要身份验证的类authentication_classes = [BasicAuthentication, SessionAuthentication, JWTAuthentication]# # 全类权限认证# permission_classes = [IsAuthenticated,]def get_permissions(self):# 定制类内方法权限认证if self.action == 'create':return []else:return [IsAuthenticated(),]def get_serializer_class(self):# 根据不同的动作调用不同的序列化类if self.action == 'retrieve':# 登录return UserSerializerelif self.action == 'create':# 注册return RegisterSerializerreturn UserSerializer# 注册def create(self, request, *args, **kwargs):serializer = self.get_serializer(data=request.data)serializer.is_valid(raise_exception=True)# 加密password = make_password(serializer.validated_data['password'])serializer.validated_data['password'] = passwordself.perform_create(serializer)headers = self.get_success_headers(serializer.data)from rest_framework import statusreturn Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)def perform_create(self, serializer):serializer.save()

django序列化drf2相关推荐

  1. django序列化器嵌套_Django Rest Framework中用于OneToOne字段的序列化程序中的嵌套关​​系

    django序列化器嵌套 The Django Rest Framework (DRF) is one of the effectively written frameworks around Dja ...

  2. Python 之 Django框架( Cookie和Session、Django中间件、AJAX、Django序列化)

    12.4 Cookie和Session 12.41 cookie Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务 ...

  3. Django 序列化三种方式 对象 列表 元组

    1.xuliehua.html <html lang="en"> <head><meta charset="UTF-8">& ...

  4. Django:序列化的几种方法

    前言 关于序列化操作,就是将一个可迭代的数据结构,通过便利的方式进行我们所需要的操作. 今天历来归纳一下,Django中的几种不同得分方法,已经Django-restframework提供的方法 创建 ...

  5. django 不包括字段 序列化器_手写一个Django序列化功能

    本文章的代码已上传至github上(github包含了更多功能,相关文章后续更新) AGL1994/django-building​github.com 前言 目前Django比较知名的序列化框架有D ...

  6. Django——序列化与反序列化

    目录 Serializer类 序列化 反序列化 模型类序列化器BookModelSerializer Serializer类 1.定义: Django REST framework中的Serializ ...

  7. Django 序列化和反序列化(九)

    一.什么是序列化和反序列化? 将程序中的一个数据结构类型转换为其他格式(字典.JSON.XML等),例如将Django中的模型类对象装换为JSON字符串,这个转换过程我们称为序列化. 反之,将其他格式 ...

  8. Django层级模型定义及序列化嵌套的方法

    ----------Django==2.0.2----------- 一.Django层级模型的定义 实例:(商品模型) class GoodsCategory(models.Model):" ...

  9. Django REST framework 1

    Django REST framework Django REST framework官方文档:点击  中文文档:点击 安装djangorestframework:pip3 install djang ...

最新文章

  1. sqlnet.ora限制导致双机应用资源启动失败
  2. 免费版最好用功能强大方便快捷的计算器Calculator#出炉~
  3. java floatmath_《Java1.doc
  4. 用树莓派+lora shield搭建一个LoRaWAN网关
  5. 精通ASP.NET MVC ——URL和Ajax辅助器方法
  6. Cortex-M3异常中断及向量表定义
  7. 802.11协议常用语缩写
  8. c标签判断true false jsp_JSP 标准标签库(JSTL) | 菜鸟教程
  9. 国内开源镜像(下载Linux系统)
  10. 怎么压缩PPT大小?PPT太大了怎么压缩?
  11. C#Form窗体模仿PhotoShop软件,高仿真原PS界面,实现PS对图片基本操作、拍照等,计算机图形学相关
  12. 武职计算机网络技术专业,武汉职业技术学院计算机系
  13. CSS浮动+背景图片+边框+文字排版+段落设置
  14. [1061]青蛙的约会
  15. 手机录制连续点赞并周期执行(免代码)
  16. 如何写好一个产品需求文档PRD
  17. 给图像增加一种噪声,构造并利用至少两种高通滤波器实现频率域的滤波
  18. 腾讯 Robotics X 轮腿式机器人
  19. java逻辑共享设计_精美图文讲解Java AQS 共享式获取同步状态以及Semaphore的应用...
  20. 从程序员到项目经理:认识项目经理

热门文章

  1. java 求正割_Java 反射机制详解
  2. C#“Multiple assemblies with equivalent identity have been imported”错误
  3. 小米手机小技巧:小米手机心率测试
  4. 3D旋转相册炫酷js特效
  5. java 导入excel 日期格式转换
  6. 实战项目——智能农业沙盘
  7. 华为v5服务器安装2012系统,裸金属服务器安装v5
  8. 前端项目怎样合理使用模块化和闭包?
  9. java imageio 使用_java – 使用ImageIO发送图像流?
  10. c语言定时器定时1ms程序,STM32 Cubemx 配置定时器定时1mS