django 过往后端搭建笔记整理 (2)--rest_framework视图使用

news2024/9/27 5:41:53

rest_framework视图使用

      • CreateAPIView---单独执行post上传逻辑
          • views.py
          • user_serializers.py

CreateAPIView—单独执行post上传逻辑

基本逻辑:
① 准备视图函数类
② 准备序列化器类 (其中可以自定义如何序列化数据、序列化哪些数据,以及如何自定义验证数据方式 和 创建方式)
③ 在视图函数中指定序列化器类

views.py
from rest_framework.generics import CreateAPIView
from user.user_serializers import CreateUserSerializer

# Create your views here.


class UserRegisterView(CreateAPIView):
    """用户注册"""
    # 使用  CreateAPIView 在序列化器设置后 直接自动调用序列后的数据进行保存
    serializer_class = CreateUserSerializer
user_serializers.py

① 如果是对原来model模型中的字段进行验证的话,序列化器可以继承

serializers.ModelSerializer,会自动对原字段进行格式检验,这就够了,但也仅仅限于每个字段的单独的格式。

一般的数据验证完格式就可以了,但是有的敏感数据还是需要进一步验证则可以看后续序号234…

from rest_framework import serializers
from .models import User
class CreateUserSerializer(serializers.ModelSerializer):
	"""用户注册提交信息的验证序列化器"""

    class Meta:
       	model = User  # 代表使用哪个模型类做校验
        # 代表对那些字段做校验  默认是全部 或者传入 ’__all__‘ 也是指全部
        fields = ('id', 'username', 'password', 'verifi_code', 'phone_number')

②如果不想使用原生定义的model校验规则(比如默认的username 校验规则里可以用100多个字符,这是不理想的,我们可以使用 extra_kwargs 自定义校验规则,如下)

在这里插入图片描述

from rest_framework import serializers
from .models import User
class CreateUserSerializer(serializers.ModelSerializer):
	"""用户注册提交信息的验证序列化器"""

    class Meta:
       	model = User  # 代表使用哪个模型类做校验
        # 代表对那些字段做校验  默认是全部 或者传入 ’__all__‘ 也是指全部
        fields = ('id', 'username', 'password', 'verifi_code', 'phone_number')
        # 复写原生校验规则
        extra_kwargs = {
            'username': {
                'min_length': 5,
                'max_length': 20,
                'error_messages': {
                    'min_length': '仅允许5-20个字符的用户名',
                    'max_length': '仅允许5-20个字符的用户名',
                }
            },
            'password': {
                'write_only': True,
                'min_length': 8,
                'max_length': 20,
                'error_messages': {
                    'min_length': '仅允许8-20个字符的密码',
                    'max_length': '仅允许8-20个字符的密码',
                }
            }
        }

③ 下面代码还额外验证了 三个新的前端提交过来的字段 但是这些并不在model 模型里,只是我们在序列化器里临时创建的,所以校验完后 在操作数据库前,要记得把他们仨从校验规则里删除(本段后文有讲)

from rest_framework import serializers
from .models import User
from django_redis import get_redis_connection

class CreateUserSerializer(serializers.ModelSerializer):
    """用户注册提交信息的验证序列化器"""
    #  新增原模型类中没有的字段(因为这些也要被校验)
    password_2 = serializers.CharField(label="确认密码",write_only=True)
    verifi_code = serializers.CharField(label='验证码',write_only=True)
    allow = serializers.CharField(label='同意协议',write_only=True)

    class Meta:
        model = User  # 代表使用哪个模型类做校验
        # 代表对那些字段做校验  默认是全部 或者传入 ’__all__‘ 也是指全部
        fields = ('id', 'username', 'password', 'password_2', 'verifi_code', 'phone_number', 'allow')
        # 复写原生校验规则
        extra_kwargs = {
            'username': {
                'min_length': 5,
                'max_length': 20,
                'error_messages': {
                    'min_length': '仅允许5-20个字符的用户名',
                    'max_length': '仅允许5-20个字符的用户名',
                }
            },
            'password': {
                'write_only': True,
                'min_length': 8,
                'max_length': 20,
                'error_messages': {
                    'min_length': '仅允许8-20个字符的密码',
                    'max_length': '仅允许8-20个字符的密码',
                }
            }
        }

④ 对于不同字段的逻辑合法性,如果想做进一步单独校验,可以在序列化器里使用半自定义的函数(注:是在序列化器里 不是Meta类里)
验证通过则返回该值 ,不通过则抛出异常

validate_字段名(self,value)

    def validate_phone_number(self,value):
        """验证手机号"""
        if not re.match(r'^1[3-9]\d{9}$',value):
            raise serializers.ValidationError(f'手机号{value}格式错误')
        return value

⑤ 如果同时相对多个字段做联合验证 则使用如下方式:

下面同时判断了三个字段 并且连接数据库做了校验

    def validate(self,data):
        """判断两次密码的一致性  以及 验证码是否正确 这里写了 就不用再单独往视图函数写了"""
        if data['password'] != data['password_2']:
            raise serializers.ValidationError(f'两次密码不一致 错误')

        # 判断验证码正误
        redis_conn = get_redis_connection()
        # 获取用户在注册界面时候获取的验证码
        real_verifi_code = redis_conn.get(f'sms_{data["email"]}')
        if not real_verifi_code:
            raise serializers.ValidationError(f'验证码已经过期')
        elif real_verifi_code != data["verifi_code"]:
            raise serializers.ValidationError(f'验证码错误')
        
        return data

⑥ 默认情况下 serializers.ModelSerializer 序列化器内置了 创建和 更新方法,在校验完毕后 会调用序列化器的 save 方法操作数据库,
如果序列化器是反序列化数据的,则会调用 create 方法;
如果序列化器是序列化数据的,则会调用 update 方法;
如果有需要特殊更改的数据,则可以在save 方法调用前,在序列化器里 覆写 该方法

  • Default .create() and .update() implementations are provided.

比如在创建用户时 他是拿所有验证数据去存的,但是有些验证的数据是我们临时加的,并不需要往数据库存,此时我们可以删掉后再自己存 之后将实例对象返回即可
在这里插入图片描述

    def create(self, validated_data):
        """创建用户"""
        # 移除数据库模型类中不存在的属性
        del validated_data['password_2']
        del validated_data['verifi_code']
        del validated_data['allow']
        # user = super().create(validated_data)
        user = User(**validated_data)
        # 调用django的认证系统加密密码
        user.set_password(validated_data['password'])
        user.save()

        return user

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/504696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苹果最近删除的照片删除怎么恢复?专业人士都这样恢复照片!

案例:苹果照片删除了怎么恢复? 【友友们,最近不小心清空了手机照片,在最近删除没有看到,有什么方法可以找回来吗?】 随着现代科技的不断发展,手机已经成为人们生活中必不可少的物品&#xff0c…

设计模式 -- 享元模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

以CSDN为例,用Charles抓浏览器接口

0 描述 很多网站,都禁止F12,这就给抓包设置了门槛,虽然解决的方法有很多,今天尝试使用工具试一试,以CSDN热榜为例,直接转python代码 1 工具下载 工欲善其事,必先利其器 这个我就不多说&#x…

MySql -- 为什么使用B+树做索引

再有人问你为什么MySQL用B树做索引,就把这篇文章发给她 本文是参考上述文章进行总结和补充,大家感兴趣也可以阅读原文. 目录 1. 索引 2. 二叉搜索树 3. 平衡二叉树 4. B树 5. B树 6.扩展 -- 聚集索引 VS 非聚集索引 1. 索引 概念:索引是一种特殊的文件&#xff…

工业4.0,无代码改变软件开发格局,数字化转型不再寸步难行

从工业1.0时代到工业4.0时代,我们已经看到了,中国在不断发展的过程中,面临着很多的挑战,企业也面临着很多的困难。在这样的大背景下,传统的开发方式已经不再适用了。很多企业开始寻求一种新的方式来开发软件&#xff0…

【场景削减】基于DBSCAN密度聚类风电-负荷确定性场景缩减方法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

1688阿里巴巴中国站图片识别商品API接口、搜图链接、收藏加购接口

API(Application Programming Interface) 是现代移动应用程序开发和互联网服务有机结合的产物。API的应用使得应用程序之间的通信变得更加轻松、快捷,尤其对于业务复杂而庞大的企业系统,API让开发者能够从中提取必要的功能进行二次…

图表控件Stimulsoft 2023.2 带来极致深色主题, 一起来看看还有哪些亮点?

Stimulsoft Reports 是一款报告编写器,主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署,如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等,在你的应用程序中嵌入报告设计器…

IS215UCVEH2AB有助于在更远距离传输电力的同时实现更好的转换效率。

​ IS215UCVEH2AB有助于在更远距离传输电力的同时实现更好的转换效率。 根据法拉第电磁感应定律,当交变磁场作用于具有磁性的材料时,材料中会感应出电动势。 由于导电材料的磁性,EMF 的电流围绕磁性材料主体旋转。这种旋转电流称为涡流。当导…

相交链表问题

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后&…

java版spring cloud 企业电子招投标采购系统源码之首页设计

随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审计监督要…

通过MyBatis(下)

作者:~小明学编程 文章专栏:spring框架 格言:热爱编程的,终将被编程所厚爱。 目录 对MyBatis进行单元测试 springboot的单元测试 生成单元测试类 MyBatis中的增删查改 增 删 查 改 ${} 和 #{} 的区别 SQL注入 模糊查询…

低版本CUDA安装/多版本切换/用户级CUDA安装

前言:我想要安装Torch V1.7.1,根据版本信息只有cuda10.2和11.0。但是,本地安装的CUDA版本为11.6和11.2,都不能满足需求。因此需要降低CUDA版本为10.2 本机系统信息 CUDA版本和显卡驱动 nvidia-smi目前CUDA版本为11.6&#xff0c…

7万字省级智慧农业大数据平台项目规划建设方案

1.1 系统总体结构和逻辑结构 XX市智慧农业项目数据中心是全省数据处理加工和数据分析应用的中心,总体上需实现上连省农业厅、下连各级农业、外连市级部门;构建资源整合、互联互通、资源共享的全省统一的数据中心资源库;构建完善的底层支撑平…

Excel常用快捷键,你也可以成为大家口中的大神

掌握复制、粘贴,相信每个职场人都能骄傲地说“自己熟练使用Excel”,果真如此不害臊吗?不出10秒钟,肯定被面试官问得哑口无言。快捷键太多,记住几个常用的,收藏起来,需要的时候过来查看。 “学E…

软考高级架构师-1计算机硬件

目录 1. 前言 & 更新2. CPU组成3.存储器4. 总线1. 前言 & 更新 计算机硬件章节19-21年没考过,在22年真题考过磁盘调度,根据趋势分析,以后考的概率也不大,了解即可。 本节删掉了第一版中的编码、海明码等内容。 2. CPU组成 计算机的基本硬件系统由控制器、运算器…

日常节省 30%计算资源:阿里云实时计算 Flink 自动调优实践

摘要:本文整理自阿里云开发工程师,Apache Flink Contributor 钟旭阳,在 Flink Forward Asia 2022 生产实践的分享。本篇内容主要分为四个部分: 1. 历史背景 2. 框架简介 3. 案例介绍 4. 未来规划 Tips:点击「阅读原文」…

粘包/拆包问题一直都存在,只是到TCP就拆不动了。

• OSI open-system-Interconnection• TCP/IP 5层协议栈 • 应用层和操作系统的边界是 系统调用 ,对应到网络编程是socket api• TCP/UDP 概况• TCP粘包问题• 结合TCP/IP报头再回顾,柳暗花明 OSI开放系统互联 定义了网络框架,以层为单位实…

【VSLAM】ORB-SLAM3安装部署与运行

心口如一,犹不失为光明磊落丈夫之行也。——梁启超 文章目录 :smirk:1. ORB-SLAM3介绍:blush:2. 代码安装部署1. 安装ros与opencv2. 安装Pangolin作为可视化和用户界面3. 安装Eigen3一个开源线性库,可进行矩阵运算4. 安装ORB-SLAM3 :satisfied:3. 案例运…

OpenHarmony开发者大会正式召开 百业齐鸣开源共兴​

4月19日,OpenHarmony 开发者大会于北京正式召开。此次会议以“开源正当时,共赢新未来”为主题,邀请了各行各业众多开发者与会,盛况非凡。据了解,此次大会由开放原子开源基金会指导,OpenHarmony 项目群工作委…