Django的web框架Django Rest_Framework精讲(二)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: Django的web框架Django Rest_Framework精讲(二)

Django的web框架Django Rest_Framework精讲(一)https://developer.aliyun.com/article/1496739

4.序列化器的使用

在ser里面创建个新的模型类

添加几条数据



(1)创建序列化器

#先引入基础序列化器类

from rest_framework import serializers
from ser import models
"""
    name = models.CharField(max_length=100,verbose_name="姓名",help_text='提示文本:不能为空')
    sex = models.BooleanField(default=1,verbose_name="性别")
    age = models.IntegerField(verbose_name="年龄")
    class_null = models.CharField(max_length=5,verbose_name="班级编号")
    description = models.TextField(max_length=1000,verbose_name="个性签名")
"""

#这个基础序列化类,能指定哪个字段序列化什么格式,可以指定序列化哪些数据,加工几条数据,返回几条数据
# 序列化哪些字段,就写与模型类中相同的名称
class StudentSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField()
    sex = serializers.BooleanField()
    age = serializers.IntegerField()
    class_null = serializers.CharField()
    description = serializers.CharField()  #对于serializer中没有的数据类型,使用CharField。不写长度默认有多长序列化多长


这样的好处是,不想要哪个字段的数据,就不用序列化

视图类一样

from django.http import JsonResponse
from django.shortcuts import render

# Create your views here.

from django.views import View
from ser import models
from ser.serializers import StudentSerializer

class StudentView(View):
    def get(self,request):
        studentdata = models.Student.objects.filter()
        #序列化多条数据,需要加上many=True,返回序列化对象
        serializer_obj = StudentSerializer(instance=studentdata,many=True)
        #返回列表类型数据
        print(serializer_obj.data,type(serializer_obj.data))
        #JsonResponse返回非字典类型数据,需要加上safe=False,中文显示中文
        return JsonResponse(serializer_obj.data,safe=False, json_dumps_params={'ensure_ascii': False})

浏览器访问

上面我们序列化queryset类型数据,我们也可以序列化模型类对象

    #序列化模型类对象对于单条数据,不用加many=true
    studentdata = models.Student.objects.get(id=1)
    serializer_obj = StudentSerializer(instance=studentdata)   #返回字典

返回的是字典

注意:serializer不是只能为数据库模型类定义,也可以为非数据库模型类的数据定义。serializer是独立于数据库之外的存在。

常用字段类型:


选项参数

这个是在序列化类里面,在序列化相关字段时,可以添加一些参数

通用参数,默认required 默认是True


5. 反序列化器使用


序列化器的使用分两个阶段:


在客户端请求时,使用序列化器可以完成对数据的反序列化。

在服务器响应时,使用序列化器可以完成对数据的序列化。

使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象。


在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回True,否则返回False。


验证失败,可以通过序列化器对象的errors属性获取错误信息,返回字典,包含了字段和字段的错误。如果是非字段错误,可以通过修改REST framework配置中的NON_FIELD_ERRORS_KEY来控制错误字典中的键名。


验证成功,可以通过序列化器对象的validated_data属性获取数据。


在定义序列化器时,指明每个字段的序列化类型和选项参数,本身就是一种验证行为。


后台收到前端发过来的数据,在保存之前要对数据进行校验,符合要求再往里面存

不符合要求报错

#定义个新的序列化器2,id是主键自增,不需要前端传递,所以不需要反序列化

# 数据校验基于用到了序列化时的参数,具体限制多少,要根据数据库创建时的要求来定
class StudentSerializer2(serializers.Serializer):
    name = serializers.CharField(max_length=8)
    sex = serializers.BooleanField()
    age = serializers.IntegerField()
    class_null = serializers.CharField()
    description = serializers.CharField()  #对于serializer中没有的数据类型,使用CharField。不写长度默认有多长序列化多长

反序列化器校验,基于用户提交的数据,再在视图函数写个post方法

  #用户提交数据逻辑
    def post(self,request):
        #保存数据之前要对用户提交的数据进行校验,将用户提交的数据放到序列化器中
        serializer_obj = StudentSerializer2(data=request.POST)
        #对数据进行校验,所有数据校验成功返回True,但凡有一个校验失败,返回False
        if serializer_obj.is_valid():
            print('校验成功后的数据',serializer_obj.validated_data)
            return JsonResponse(serializer_obj.validated_data,safe=False, json_dumps_params={'ensure_ascii': False})
        else:
            #打印校验失败信息
            print(serializer_obj.errors)
            #校验失败,返回错误信息,并修改状态码
            return JsonResponse({'error':'校验失败'},status=400)

我们借助接口调试工具postman或国产的apipost来调试

我们使用国产的apipost,可以设置请求类型,携带的请求参数

可以原生row的json类型提交,也可以form表单的www-form-urlencoded,form-data


apipost功能还是太少,我们使用postman

向后台传输原生json类型

注意,json 键和值如果是字符串类型,必须用英文双引号

最后一对键值对后面不能有逗号


后台打印可知,没接收到数据,因为Django默认解析不了json类型数据

一般情况下,需要我们通过request.body将数据取出来,然后自己手动序列化解析


现在我们通过DRF来帮我们自动解析,简化工作量

视图类继承drf的apiview from rest_framework.views import APIView

继承了APIView之后,视图类定义的请求方法中的request 就被重新加工了一遍


APIView类还是继承的View,对View进行了拓展

对View里面的request进行了扩展


扩展后的request,再从前端拿数据,不用request.POST了 使用request.data

request.data就能获取到前端post请求提交过来的json数据

不管什么格式,都能解析出来


request.data 返回解析后的请求体数据。类似Django中标准的request.POST和request.FILES属性,但是能提供如下属性

包含了解析后的文件和非文件数据

包含了对POST,PUT,PATCH请求方式解析后的数据

利用了REST framework的parsers解析器,不仅支持表单类型数据(unlencoded/data),也支持JSON数据(application/json)

此时,重启服务器,postman发送post请求


后台已经获取到,获取到的就是字典类型数据

当name字段长度超过限制,则会报错


查看打印的错误信息,code指明哪个参数校验报的错

发送符合要求的字段,就不再报错

现在我们发送个正确的post请求

返回正常的json类型数据


请求正常,就保存数据

allow_blank,默认为False, 空字符串 如果想要实现不传数据,需要结合required =False


validators校验函数

a).可以在序列化器字段上使用validators函数指定自定义的校验规则

b).validators值必须为序列类型(类表),在列表中可以添加多个校验规则

c).DRF框架自带的UniqueValidator校验器,必须指定queryset参数指定查询集对象,用于对该字段的唯一性进行校验,UniqueValidator里面还可以使用message指定自定义报错信息

    在序列化器需要反序列化输入校验的字段中,指定validators=[校验规则1,校验规则2...]参数,可以使用drf自带的校验规则UniqueValidator, 也可以使用自定义的的校验规则

error_messages 可以自定义报错信息 自定义错误信息用字典包裹,针对每个参数定义报错信息

发送post请求

这样,报错信息就是我们自定义的,实现了错误信息定制

不传name


上面序列化器,一个是用于序列化用的,一个是反序列化数据校验的,

序列化和反序列化 能不能合并成一个序列化器来使用呢?


可以的


针对个别字段,有的只用于序列化输出,有的只用于反序列化输入,可以用下面两个参数控制

read_only 表明该字段仅用于序列化输出,默认False 用户提交数据时,不校验该字段

write_only 表明该字段仅用于反序列化输入,默认False 序列化时不会把该字段提取出来,服务端响应数据时,不响应给客户端该字段。反序列化时,客户端必须要传该字段进行校验


序列化器合成一个

#将序列化和反序列化合并在一个序列化类中实现
class StudentSerializer3(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)   #id在序列化时需要,反序列化时不需要
    name = serializers.CharField(max_length=8)
    sex = serializers.BooleanField()
    age = serializers.IntegerField(max_value=200)
    class_null = serializers.CharField()
    description = serializers.CharField()  #对于serializer中没有的数据类型,使用CharField。不写长度默认有多长序列化多长


视图类中,get请求和post请求,都用该序列化器

get请求,能收到数据

post请求,能提交数据


post请求校验成功



read_only使用场景:一般用在id上,序列化时需要,用户提交数据时不需要提交该字段

write_only使用场景:一般用在用户短信验证码,输入手机号,用户收到验证码,需要提交到后台验证,但是不需要服务端响应给客户,也不需要保存到数据库。


好了,今天先到这,明天继续,Carry on !

相关文章
|
27天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
38 4
|
29天前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
87 3
|
11天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
90 44
|
7天前
|
SQL 安全 PHP
探索PHP的现代演进:从Web开发到框架创新
PHP是一种流行的服务器端脚本语言,自诞生以来在Web开发领域占据重要地位。从简单的网页脚本到支持面向对象编程的现代语言,PHP经历了多次重大更新。本文探讨PHP的现代演进历程,重点介绍其在Web开发中的应用及框架创新,如Laravel、Symfony等。这些框架不仅简化了开发流程,还提高了开发效率和安全性。
15 3
|
6天前
|
前端开发 JavaScript 开发工具
从框架到现代Web开发实践
从框架到现代Web开发实践
15 1
|
7天前
|
API 数据库 开发者
深度剖析Django/Flask:解锁Web开发新姿势,让创意无限延伸!
在Web开发领域,Django与Flask如同两颗璀璨的星辰,各具特色。Django提供全栈解决方案,适合快速开发复杂应用;Flask则轻量灵活,适合小型项目和API开发。本文通过问答形式,深入解析两大框架的使用方法和选择策略,助你解锁Web开发新技能。
18 2
|
29天前
|
IDE 关系型数据库 MySQL
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
这篇文章是关于如何创建一个Django框架,介绍Django的项目结构和开发逻辑,并指导如何创建应用和编写“Hello, World!”程序的教程。
34 3
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
|
9天前
|
SQL 安全 PHP
探索PHP的现代演进:从Web开发到框架创新
PHP 自发布以来一直在 Web 开发领域占据重要地位,历经多次重大更新,从简单的脚本语言进化为支持面向对象编程的现代语言。本文探讨 PHP 的演进历程,重点介绍其在 Web 开发中的应用及框架创新。自 PHP 5.3 引入命名空间后,PHP 迈向了面向对象编程时代;PHP 7 通过优化内核大幅提升性能;PHP 8 更是带来了属性、刚性类型等新特性。
19 3
|
12天前
|
前端开发 JavaScript
Bootstrap Web 前端 UI 框架
Bootstrap 是快速开发 Web 应用程序的前端工具包。
28 3
|
12天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
26 2