rest_framework 学习笔记(一)
rest_framework
简介
Django REST框架是一个功能强大且灵活的工具包,用于构建Web API。
官方网站:https://www.django-rest-framework.org
安装与加载
pip install djangorestframework
INSTALLED_APPS = [
...,
'rest_framework'
]
序列化与反序列化流程
反序列化流程
反序列化流程 是从前端提交数据到数据库的流程。
web提交数据 --> get/post...请求
get/post...请求 --> to_internal_value
to_internal_value --> 序列化映射
序列化映射 --> 自定义字段验证
自定义字段验证 --> 对象级别验证
对象级别验证 --> action
action --> to_representation
序列化流程
序列化是将数据从数据库提交到前端的过程。
QuerySet --> serializer
serializer --> to_representation
to_representation --> 前端
序列化模型
创建 serializers.py文件
from rest_framework import serializers
from .models import Idc
class IdcSerializer(serializers.Serializer):
"""
Idc 序列化类
"""
id = serializers.IntegerField(read_only=True)
name = serializers.CharField(required=True, max_length=32)
address = serializers.CharField(required=True, max_length=256)
phone = serializers.CharField(required=True, max_length=15)
email = serializers.EmailField(required=True, max_length=50)
letter = serializers.CharField(required=True, max_length=5)
### 定义create 与update 为反序列化准备
def create(self, validated_data):
return Idc.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.name = validated_data.get("name", instance.name)
instance.address = validated_data.get("address", instance.name)
instance.phone = validated_data.get("phone", instance.name)
instance.email = validated_data.get("email", instance.name)
instance.save()
return instance
序列与反序列化方法
from django.utils.six import BytesIO
from rest_framework.parsers import JSONParser
from rest_framework.renderers import JSONRenderer
## 序列化
queryset = Idc.objects.all()
serializer = IdcSerializer(queryset, many=True)
ret = JSONRenderer().render(serializer)
## 反序列化
## content 前端传入的byte 型字符串
stream = BytesIO(content)
data = JSONParser().parse(stream)
serialize1 = IdcSerializer(data=data)
# 验证数据合法性
serialize1.is_valid()
# 保存数据
serialize1.save()
# 获取合法数据
serialize1.validated_data
view 逻辑实现
from .models import Idc
from rest_framework.decorators import api_view
from rest_framework import status
from rest_framework.response import Response
from .serializers import IdcSerializer
# ################ 版本2 ################
# 使用api_view 限制请求方式, 使用Response 简化序列化流程
@api_view(["GET", "POST"])
def idc_list(request, *args, **kwargs):
if request.method == "GET":
print(request.path)
queryset = Idc.objects.all()
serializer = IdcSerializer(queryset, many=True)
return Response(serializer.data)
if request.method == "POST":
serializer = IdcSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(status=status.HTTP_201_CREATED)
return Response(status=status.HTTP_400_BAD_REQUEST)
@api_view(["GET", "PUT"])
def idc_detail(request, pk, *args, **kwargs):
try:
queryset = Idc.objects.get(pk=pk)
except:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == "GET":
serializer = IdcSerializer(queryset)
return Response(serializer.data)
if request.method == "PUT":
serializer = IdcSerializer(queryset, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(status=status.HTTP_202_ACCEPTED)
return Response(status=status.HTTP_400_BAD_REQUEST)
# ################ 版本3 ################
# 使用类视图进行改写
from rest_framework.views import APIView
from django.http import Http404
class IdcList(APIView):
def get(self, request, format=None):
queryset = Idc.objects.all()
serializer = IdcSerializer(queryset, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer = IdcSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.data, status=status.HTTP_400_BAD_REQUEST)
class IdcDetail(APIView):
def get_obj(self, pk):
try:
Idc_obj = Idc.objects.get(pk=pk)
return Idc_obj
except Idc.DoesNotExist:
raise Http404
def get(self, request, pk, format=None):
queryset = self.get_obj(pk)
serializer = IdcSerializer(queryset)
return Response(serializer.data)
def post(self, request, pk, format=None):
queryset = self.get_obj(pk)
serializer = IdcSerializer(queryset, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(status=status.HTTP_202_ACCEPTED)
return Response(status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk, format=None):
queryset = self.get_obj(pk)
queryset.delete()
return Response(status.HTTP_204_NO_CONTENT)
# ################ 版本6 ################
# 使用混合, 将所有请求方法定义在一个视图下
from rest_framework import viewsets
class IdcListV6(viewsets.GenericViewSet,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
mixins.CreateModelMixin
):
queryset = Idc.objects.all()
serializer_class = IdcSerializer
# ################ 版本7 ################
# 简化继承关系
from rest_framework import viewsets
class IdcViewSetV7(viewsets.ModelViewSet):
queryset = Idc.objects.all()
serializer_class = IdcSerializer
from rest_framework.routers import DefaultRouter
注册接口
from rest_framework.routers import DefaultRouter
route = DefaultRouter()
route.register("idcs", views.IdcViewSetV7)
urlpatterns = [
url(r'^', include(route.urls))
]
rest_framework 学习笔记(一)的更多相关文章
- Django RF:学习笔记(8)——快速开始
Django RF:学习笔记(8)——快速开始 安装配置 1.使用Pip安装Django REST Framework: pip install djangorestframework 2.在Sett ...
- Django:学习笔记(3)——REST实现
Django:学习笔记(3)——REST实现 了解REST风格 按照传统的开发方式,我们在实现CURD操作时,会写多个映射路径,比如对一本书的操作,我们会写多个URL,可能如下 web/deleteB ...
- Vue学习笔记-rest_framework_jwt 学习
一 使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7 (Windows x86- ...
- Vue学习笔记-Django REST framework3后端接口API学习
一 使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7 (Windows x86- ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
随机推荐
- CF311B Cats Transport(斜率优化)
题目描述 Zxr960115 是一个大农场主.他养了m只可爱的猫子,雇佣了p个铲屎官.这里有一条又直又长的道路穿过了农场,有n个山丘坐落在道路周围,编号自左往右从1到n.山丘i与山丘i-1的距离是Di ...
- CSRF(跨站请求伪造)
跨站请求伪造(Cross-site request forgery)是一种冒充受信任用户,向服务器发送非预期请求的攻击方式. 攻击的前提是: 用户已经登录过某网站. 攻击者通过一些诱惑性的标题,诱惑用 ...
- CentOS重新安装yum
1.问题描述 有时会出现yum不可用的错误,可以先卸载再重装. 2.操作步骤 (1).下载Python-iniparse-0.4 -9.el7.noarch.rpm (2).下载yum-3.4. ...
- 「CF712E」Memory and Casinos「线段树」「概率」
题解 解法1:(官方做法) 一段区间的\(L\)定义为从最左边开始出发,最左不失败,一直到最右边胜利的概率,\(R\)定义为从最右边开始出发,最左不失败,又回到最右边胜利的概率 考虑一个区间\([l, ...
- List,Set,Map在java.util包下都是接口 List有两个实现类:ArrayList和LinkedList Set有两个实现类:HashSet和LinkedHashSet AbstractSet实现了Set
List,Set,Map在java.util包下都是接口 List有两个实现类:ArrayList和LinkedListSet有两个实现类:HashSet和LinkedHashSetAbstractS ...
- C#实现代码生成器
最近在用layui做后台管理,增删改查这些一成不变的东西写起来浪费大量时间,于是做了个简单的代码生成器快速生成 代码生成器的原理其实很简单,都是基于模板实现替换,Razor是个不错的选择(或者Nvel ...
- [Linux]ubuntu更改国内源
转自: https://blog.csdn.net/qq_35451572/article/details/79516563 推荐快速更新国内源 https://blog.csdn.net/qq_35 ...
- python_glob模块的使用
glob是Python自己带的一个文件操作相关模块,用它可以查找符合自己目的的文件,就类似于Windows下的文件搜索,支持通配符操作,*,?,[]这三个通配符,*代表0个或多个字符,?代表一个字符, ...
- php unicode转字符串
<?php /** * @param string $str 需转换字符,这里为单个字符 * @return string */ function get_unicode($str) { $bi ...
- Dubbo 节点telnet测试
Dubbo 节点telnet测试 本地安装telnet客户端 Telnet 服务地址 端口 如telnet 127.0.0.1 1234 出现此对话框表示连接成功 输入status –l 会显 ...