一、restfull规范的简单介绍

1、介绍

REST:表述性状态转移,是一种web交互方案

资源:在web中只要有被引用的必要都是资源

URI:
  URI 统一资源标识符
  URL 统一资源定位符

统一资源接口
  根据HTTP请求方式的不同对资源进行不同的操作
  遵循HTTP请求方式的语义

前后端传输的叫资源的表述

前端展现的叫资源的状态

通过超链接的指引告诉用户接下来有哪些资源状态可以进入

2、restfull规范

核心思想
-- 面向资源去编程
每个url就是资源的体现 尽量用名词不要用动词
-- 根据HTTP请求方式的不同对资源进行不同的操作 URL体现
-- 版本
https://v3.bootcss.com
https://bootcss.com/v3
-- 体现是否是API
https://v3.bootcss.com/api
-- 过滤信息
https://v3.bootcss.com?page=1
-- 尽量用HTTPS 返回值体现
-- 携带状态码
-- 携带错误信息
-- 返回值
get 返回查看的所有或者单条信息
post 返回新增的那条数据
put/patch 返回更新那条数据
delete 返回空
-- 携带超链接

二、DRF的视图的封装

1、为什么要封装

当有很多个表进行增删改查时,实际上很多代码都是相同的,只是要获取的queryset和序列化器等不同,这就导致我们的视图有特别多重复的代码,
因此对视图进行封装,可减少代码的冗余。

2、要封装的原视图

class BookView(APIView):
def get(self, request):
book_queryset = Book.objects.all()
ser_obj = BookSerializer(book_queryset, many=True)
return Response(ser_obj.data) # 新增书籍
def post(self, request):
book_obj = request.data
ser_obj = BookSerializer(data=book_obj)
if ser_obj.is_valid():
ser_obj.save()
print(ser_obj.validated_data)
return Response(ser_obj.data)
# 校验不通过返回错误信息
return Response(ser_obj.errors) # 编辑书籍
class BookEditView(APIView):
def get(self, request, id):
book_obj = Book.objects.filter(pk=id).first()
ser_obj = BookSerializer(book_obj)
return Response(ser_obj.data) def put(self, request, id):
book_obj = Book.objects.filter(id=id).first()
ser_obj = BookSerializer(instance=book_obj, data=request.data, partial=True)
if ser_obj.is_valid():
ser_obj.save()
return Response(ser_obj.data)
return Response(ser_obj.errors) def delete(self, request, id):
book_obj = Book.objects.filter(id=id).first()
if book_obj:
book_obj.delete()
return Response('')
return Response('删除对象不存在')

3、第一次封装

# 获取query_set和序列化器的类
class GenericAPIView(APIView):
query_set = None
serializer_class = None def get_queryset(self):
return self.query_set def get_serializer(self, *args, **kwargs):
return self.serializer_class(*args, **kwargs) # 实现get方法的类
# 小知识点:一般Mixin代表的是混合类,单独继承ListModelMixin你去哪里找get_queryset方法
# 因此,其他类继承Mixin类的时候,还应该多继承其他的某些类
class ListModelMixin(object):
def list(self, request):
queryset = self.get_queryset()
ser_obj = self.get_serializer(queryset, many=True)
return Response(ser_obj.data) # 实现post方法的类
class CreateModelMixin(object):
def create(self, request):
# 获取前端传过来的数据
obj = request.data
# 用序列化器做校验
ser_obj = self.get_serializer(data=obj)
if ser_obj.is_valid():
# 校验通过,新增书籍
ser_obj.save() # 这里的save方法会去调用序列化器的create方法
print(ser_obj.validated_data) # validated_data是通过校验的数据,也会封装到data里面
return Response(ser_obj.data)
# 校验不通过返回错误信息
return Response(ser_obj.errors) # 实现编辑的get方法的类
class RetrieveModelMixin(object):
def retrieve(self, request, id):
book_obj = self.get_queryset().filter(pk=id).first()
ser_obj = self.get_serializer(book_obj)
return Response(ser_obj.data) # 实现编辑的put方法的类
class UpdateModelMixin(object):
def update(self, request, id):
book_obj = self.get_queryset().filter(id=id).first()
ser_obj = self.get_serializer(instance=book_obj, data=request.data, partial=True)
if ser_obj.is_valid():
ser_obj.save()
return Response(ser_obj.data)
return Response(ser_obj.errors) # 实现删除delete方法的类
class DestroyModelMixin(object):
def destroy(self, request, id):
book_obj = self.get_queryset().filter(id=id).first()
if book_obj:
book_obj.delete()
return Response("")
return Response("删除的对象不存在") # 书籍列表
class BookView(GenericAPIView,ListModelMixin, CreateModelMixin):
query_set = Book.objects.all()
serializer_class = BookSerializer def get(self, request):
return self.list(request) def post(self, request):
return self.create(request) class BookEditView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
query_set = Book.objects.all()
serializer_class = BookSerializer def get(self, request, id):
return self.retrieve(request, id) def put(self, request, id):
return self.update(request, id) def delete(self, request, id):
return self.destroy(request, id)

4、第二次封装

由于上面的继承太长了,因此我们细化一点点,其实就是在第一次封装的基础上另外设置一些类来进行了继承。

# 继承上面需要的类,别的类只需继承这个类即可使用这个类继承的方法
class ListCreateModelMixin(GenericAPIView,ListModelMixin, CreateModelMixin):
pass class RetrieveUpdateDestroyModelMixin(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
pass # 书籍列表
class BookView(ListCreateModelMixin):
query_set = Book.objects.all()
serializer_class = BookSerializer def get(self, request):
return self.list(request) def post(self, request):
return self.create(request) class BookEditView(RetrieveUpdateDestroyModelMixin):
query_set = Book.objects.all()
serializer_class = BookSerializer def get(self, request, id):
return self.retrieve(request, id) def put(self, request, id):
return self.update(request, id) def delete(self, request, id):
return self.destroy(request, id)

5、第三次封装

1. DRF框架的ViewSetMixin类重写了CBV的as_view方法,使其可以接收参数,路由分发的时候会根据参数进行分发,
继承了ViewSetMixin的类,它的路由as_view可以传参 2. urls.py
from django.conf.urls import url
from libsys import views urlpatterns = [
url(r'^list/$', views.BookModelView.as_view({"get": "list", "post": "create"})),
url(r'^retrieve/(?P<id>\d+)/$', views.BookModelView.as_view({"get": "retrieve", "put": "update", "delete": "destroy"})),
] 3. 第三次封装
from rest_framework.viewsets import ViewSetMixin # 重写as_view使其可以传参 # 继承上面需要的类,别的类只需继承这个类即可使用这个类继承的方法
class ListCreateModelMixin(GenericAPIView,ListModelMixin, CreateModelMixin):
pass class RetrieveUpdateDestroyModelMixin(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
pass # 五合一的视图
# ViewSetMixin必须在GenericAPIView前面,因为需要ViewSetMixin先做路由的分发
class ModelViewSet(ViewSetMixin, ListCreateModelMixin, RetrieveUpdateDestroyModelMixin):
pass class BookModelView(ModelViewSet):
# 这里什么都不用写了,因为as_view重写后,某个请求进来会默认去找它对应的方法
# 这里找不到,就会去父类中找
query_set = Book.objects.all()
serializer_class = BookSerializer

6、使用DRF框架帮我们封装好的模块

1. 直接使用DRF自带的ModelViewSet(DRF的ModelViewSet也是继承了ViewSetMixin和那6个方法的类)
注意:
DRF中使用queryset,我们自定义的是query_set
用框架封装的视图,我们url上的那个关键字参数要用pk,系统默认的 2. urls.py
from django.conf.urls import url
from libsys import views urlpatterns = [
url(r'^list/$', views.BookModelView.as_view({"get": "list", "post": "create"})),
url(r'^retrieve/(?P<pk>\d+)/$', views.BookModelView.as_view({"get": "retrieve", "put": "update", "delete": "destroy"})),
] 3. 视图
from rest_framework.viewsets import ModelViewSet # 这里的ModelViewSet是DRF给我们的类 class BookModelView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer

三、路由

from rest_framework.routers import DefaultRouter
第一步实例化对象
router = DefaultRouter() 第二步把路由以及视图注册到对象
router.register('list', views.BookModelView) # 路径,视图 第三步生成可传参的路由
urlpatterns += router.urls 注意:用默认生成的路由,必须保证你的视图函数是继承了ViewSetMixin,即你的as_view方法是可以传参的 在浏览器中就可以输入:
list/
list/1
list/2
... 还额外生成了不用模板的数据路由
list.json
list/1.json

四、DRF框架视图类

1、DRF给我们提供的所有视图,都在这几个模块下

from rest_framework import views
from rest_framework import viewsets
from rest_framework import mixins
from rest_framework import generics

2、这几个模块主要封装的类

from rest_framework import views
# 封装了APIView
# class APIView(View) from rest_framework import viewsets
# 封装了ViewSetMixin
# class ViewSetMixin(object) from rest_framework import mixins
# 封装了我们请求的5个方法的类
# class CreateModelMixin(object) # class ListModelMixin(object) # class RetrieveModelMixin(object) # class UpdateModelMixin(object) # class DestroyModelMixin(object) from rest_framework import generics
# 封装了我们获取queryset和serializer方法的类
# class GenericAPIView(views.APIView):
# def get_queryset()
# def get_object()
# def get_serializer()

3、ModelViewSet

restfull规范、DRF视图和路由的更多相关文章

  1. DRF 视图和路由

    Django Rest Feamework 视图和路由 DRF的视图 APIView 我们django中写CBV的时候继承的是View,rest_framework继承的是APIView,那么他们两个 ...

  2. DRF 视图组件,路由组件

    视图组件  -- 第一次封装   -- GenericAPIView(APIView):    queryset = None    serializer_class = None    def ge ...

  3. DRF 的视图,路由和渲染器

    DRF 的视图,路由和渲染器 1 视图 简单的增删改查 : ModelViewSet; 复杂的操作使用APIView 和 GenericViewSet APIView(View) class Home ...

  4. drf 视图使用及源码分析

    前言 drf视图的源码非常的绕,但是实现的功能却非常的神奇. 它能够帮你快速的解决ORM增删改查的重复代码,非常的方便好用. 下面是它源码中的一句话: class ViewSetMixin: &quo ...

  5. Django REST framework基础:视图和路由

    DRF中的Request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别于Dj ...

  6. Django Rest Framework 视图和路由

    Django Rest Framework 视图和路由   DRF的视图 APIView 我们django中写CBV的时候继承的是View,rest_framework继承的是APIView,那么他们 ...

  7. 使用DRF视图集时自定义action方法

    在我们用DRF视图集完成了查找全部部门,创建一个新的部门,查找一个部门,修改一个部门,删除一个部门的功能后,views.py的代码是这样子的: class DepartmentViewSet(Mode ...

  8. Rest_Framework的视图与路由

    视图与路由 drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. Django ...

  9. 视图家族 & 路由组件

    目录 视图家族 & 路由组件 视图集与路由组件 基于 GenericAPIView 的十大接口 基于 generics 包下工具视图类的六大基础接口 视图集 路由组件:必须配合视图集使用 自定 ...

随机推荐

  1. js中数组的map()方法

    map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值 map()方法按照原是数组顺序以此处理元素 注意:map()不会对空数组进行检测 :不会改变原始的数组 实例: var nu ...

  2. USGS-EROS项目espa-surface-reflectance中的Landsat8 大气校正LaSRC Version 1.3.0模块利用vs2010编译出windows64位版本(四)

    ,支持一些关键问题: 1    数据初始化问题.该问题是指在linux环境下编程标准c并编译,用户定义的变量默认初始值是0,但在windows 64 win7环境中,变量默认初始值是负值极小.... ...

  3. ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC 视图引擎(Razor)简介 ASP.NET Core MVC 视图(Razor)ViewData使用示例 ASP.NET Core MV ...

  4. reStructuredText文件语法简单学习

    reStructuredText 是一种扩展名为.rst的纯文本文件,通过特定的解释器,能够将文本中的内容输出为特定的格式 1. 章节标题 章节头部由下线(也可有上线)和包含标点的标题组合创建,其中下 ...

  5. mssql 存储过程调用另一个存储过程中的结果的方法分享

    转自:http://www.maomao365.com/?p=6801 摘要: 下文将分享"一个存储过程"中如何调用"另一个存储过程的返回结果",并应用到自身的 ...

  6. 从0开始的Python学习010return语句&DocStrings

    return语句 return语句用来从一个函数中 返回 即跳出函数.当然也可以从函数中返回一个值. #return 语句从一个函数返回 即跳出函数.我们也可选从函数返回一个值 def maximum ...

  7. iOS 防止离屏渲染为 image 添加圆角

        // image 分类 - (UIImage *)circleImage{ // NO 代表透明 UIGraphicsBeginImageContextWithOptions(self.siz ...

  8. Python爬虫之Selenium库的基本使用

    Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Fire ...

  9. const int *p;int *const p;区别及用法

    在单片机程序设计中,我们经常会用到const这个关键字,在有些单片机的编译器中可能会是code(比如51系列单片机),但我们在学习C语言的时候,首先还是先学到的const.我们知道,const关键字的 ...

  10. Jenkins插件之显示构建时间

    1.进入jenkin插件管理器中,安装  Timestamper 插件 2.安装完成后,进入到构建任务里面,在 构建环境 中勾选  Add timestamps to the Console Outp ...