目录

  • Request
  • Response
  • APIView(一级视图)
  • GenericAPIView(二级视图)
  • Mixin
  • 子类视图(三级视图)
  • 路由Router

Request

REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了HttpRequest类的Request类的对象。
REST framework 提供了Parser解析器,在接收到请求后会自动根据Content-Type指明的请求数据类型(如JSON、表单等)将请求数据进行parse解析,解析为类字典对象保存到Request对象中。
Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。
无论前端发送的哪种格式的数据,我们都可以以统一的方式读取数据。

常用属性 描述
data request.data返回解析后的POST请求体数据。
query_params request.query_params返回解析后的GET请求体数据。

Response

REST framework提供了一个响应类Response,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。
REST framework提供了Renderer渲染器,用来根据请求头中的Accept(接收数据类型声明)来自动转换响应数据到对应格式。如果前端请求中未进行Accept声明,则会采用默认方式处理响应数据,我们可以通过配置来修改默认响应格式。
配置:

REST_FRAMEWORK = {'DEFAULT_RENDERER_CLASSES': (  # 默认响应渲染类'rest_framework.renderers.JSONRenderer',  # json渲染器'rest_framework.renderers.BrowsableAPIRenderer',  # 浏览API渲染器)
}

构造方式:

Response(data, status=None, template_name=None, headers=None, content_type=None)
参数 描述
data 为响应准备的序列化处理后的数据;
status 状态码,默认200;
template_name 模板名称,如果使用HTMLRenderer时需指明;
headers 用于存放响应头信息的字典;
content_type 响应数据的Content-Type,通常此参数无需传递,REST framework会根据前端所需类型数据来设置该参数。

APIView(一级视图)

继承自View父类,传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象;视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;
任何APIException异常都会被捕获到,并且处理成合适的响应信息;
在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。

支持定义的属性 描述
authentication_classes 列表或元组,身份认证类
permissoin_classes 列表或元组,权限检查类
throttle_classes 列表或元组,流量控制类

例:

from rest_framework.views import APIView
from rest_framework.response import Response# url(r'^books/$', views.BookListView.as_view()),
class BookListView(APIView):def get(self, request):books = BookInfo.objects.all()serializer = BookInfoSerializer(books, many=True)return Response(serializer.data)

GenericAPIView(二级视图)

继承自APIVIew,增加了对于列表视图和详情视图可能用到的通用支持方法。通常使用时,可搭配一个或多个Mixin扩展类。
使用GenericAPIView类一般需要实现queryset属性或者重写get_queryset方法,需要实现serializer_class属性或重写get_serializer_class方法。
1.支持定义的属性:
列表视图与详情视图通用:

属性 描述
queryset 列表视图的查询集
serializer_class 视图使用的序列化器

列表视图使用:

属性 描述
pagination_class 分页控制类
filter_backends 过滤控制后端

详情页视图使用:

属性 描述
lookup_field 查询单一数据库对象时使用的条件字段,默认为’pk’
lookup_url_kwarg 查询单一数据时URL中的参数关键字名称,默认与look_field相同

2.提供的方法:
列表与详情通用:

get_queryset(self)
返回视图使用的查询集,是列表视图与详情视图获取数据的基础,默认返回queryset属性,可以重写,例如:
def get_queryset(self):user = self.request.userreturn user.accounts.all()get_serializer_class(self)
返回序列化器类,默认返回serializer_class,可以重写,例如:
def get_serializer_class(self):if self.request.user.is_staff:return FullAccountSerializerreturn BasicAccountSerializerget_serializer(self,_args, *_kwargs)
返回序列化器对象,被其他视图或扩展类使用,如果我们在视图中想要获取序列化器对象,可以直接调用此方法。
注意,在提供序列化器对象的时候,REST framework会向对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。

详情使用:

get_object(self)返回详情视图所需的模型类数据对象,默认使用lookup_field参数来过滤queryset。 在试图中可以调用该方法获取详情信息的模型类对象。
若详情访问的模型类对象不存在,会返回404。
该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问。

Mixin

配合GenericAPIView使用,将一些常用方法封装。
1.ListModelMixin:
快速实现列表视图,提供list(request, *args, **kwargs)方法,并返回200状态码。
例:

from rest_framework.mixins import ListModelMixin
from rest_framework.generics import GenericAPIViewclass ListModelView(ListModelMixin,GenericAPIView):queryset = BookInfo.objects.all()serializer_class = BookInfoSerializerdef get(self,request):return self.list(request)

2.CreateModelMixin:
创建视图扩展类,提供create(request, *args, **kwargs)方法快速实现创建资源的视图, 成功返回201状态码。
如果序列化器对前端发送的数据验证失败,返回400错误。
例:

from rest_framework.mixins import CreateModelMixinclass ListModelView(CreateModelMixin,GenericAPIView):queryset = BookInfo.objects.all()serializer_class = BookInfoSerializerdef post(self,request):return self.create(request)

3.RetrieveModelMixin:
详情视图扩展类,提供retrieve(request, *args, **kwargs)方法,可以快速实现返回一个 存在的数据对象。
如果存在,返回200, 否则返回404。
例:

from rest_framework.mixins import RetrieveModelMixinclass ListModelView(RetrieveModelMixin,GenericAPIView):queryset = BookInfo.objects.all()serializer_class = BookInfoSerializerdef get(self,request,pk):return self.retrieve(request)

4.UpdateModelMixin:
更新视图扩展类,提供update(request, *args, **kwargs)方法,可以快速实现更新一个存 在的数据对象。
同时也提供partial_update(request, *args, **kwargs)方法,可以实现局部更新。
成功返回200,序列化器校验数据失败时,返回400错误。
例:

from rest_framework.mixins import UpdateModelMixinclass ListModelView(UpdateModelMixin,GenericAPIView):queryset = BookInfo.objects.all()serializer_class = BookInfoSerializerdef put(self,request,pk):return self.update(request)

5.DestoryModelMixin:
删除视图扩展类,提供destroy(request, *args, **kwargs)方法,可以快速实现删除一个存 在的数据对象。成功返回204,不存在返回404。
例:

from rest_framework.mixins import DestroyModelMixinclass ListModelView(DestroyModelMixin,GenericAPIView):queryset = BookInfo.objects.all()serializer_class = BookInfoSerializerdef delete(self,request,pk):return self.destroy(request)

子类视图(三级视图)

1.CreateAPIView
提供 post 方法
继承自: GenericAPIView、CreateModelMixin

2.ListAPIView
提供 get 方法
继承自:GenericAPIView、ListModelMixin

3.RetireveAPIView
提供 get 方法
继承自: GenericAPIView、RetrieveModelMixin

4.DestoryAPIView
提供 delete 方法
继承自:GenericAPIView、DestoryModelMixin

5.UpdateAPIView
提供 put 和 patch 方法
继承自:GenericAPIView、UpdateModelMixin

6.RetrieveUpdateAPIView
提供 get、put、patch方法
继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin

7.RetrieveUpdateDestoryAPIView
提供 get、put、patch、delete方法
继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin

例:
只需定义queryset和serializer_class,或重写get_queryset与get_serializer_class方法

from rest_framework.generics import CreateAPIViewclass BookCreateAPIView(CreateAPIView):# queryset = BookInfo.objects.all()def get_queryset(self):return BookInfo.objects.all()# serializer_class = BookModelSerializerdef get_serializer_class(self):return BookModelSerializer

路由Router

1.router对象:
SimpleRouter:不创建首页视图
DefaultRouter:创建首页视图
2.使用方法:
(1)创建router对象,并注册视图集:
用法:
register(prefix, viewset,base_name)

参数 描述
prefix 该视图集的路由前缀
viewset 视图集
base_name 路由名称的前缀

例:

from rest_framework import routersrouter = routers.SimpleRouter()
router.register(r'books', BookViewSet, base_name='book')如上述代码会形成的路由如下:
^books/$    name: book-list
^books/{pk}/$   name: book-detail

(2)添加路由数据:
可以有两种方式:

urlpatterns = [...
]
urlpatterns += router.urls
或
urlpatterns = [...url(r'^', include(router.urls))
]

3.视图集中包含附加动作:
使用action装饰器
用法:

@action(methods=[xxxx], detail)
参数 描述
methods 访问的方法
detail 是否为详情页面

例:

detail为True: ^books/{pk}/set_bookname/$    name: books-set-bookname
detail为False: ^books/order_comment/$       name: books-order-comment

Django框架——视图相关推荐

  1. Django框架视图类

    类视图 在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图.使用类视图可以使用类的一些特性,比如继承等. View django.views.generic.base.View是主 ...

  2. django mysql视图_Django框架使用mysql视图操作示例

    本文实例讲述了django框架使用mysql视图操作.分享给大家供大家参考,具体如下: 一.mysql视图的创建 mysql中,在两个或者以上的基本表上创建视图,例如:在studentorm表和inf ...

  3. Django框架-Django视图(views)系统

    Django的视图系统 定义:一个视图函数(或类),简称为视图,是一个简单的python函数或类,它接受web请求并且返回web响应. 响应可以是一张网页的html内容,一个重定向,一个404错误,一 ...

  4. Django框架之第二篇

    Django框架之第二篇 一.知识点回顾 1.MTV模型 model:模型,和数据库相关的 template:模板,存放html文件,模板语法(目的是将变量如何巧妙的嵌入到HTML页面中). view ...

  5. django框架--路由系统

    目录 一.路由系统理解 二.路由系统功能划分 三.路由表创建 创建工具 二级路由 路由别名 动态路由及重定向 四.自定义错误页面 五.图示路由系统在框架中的定位 六.路由系统的进阶想法 一.路由系统理 ...

  6. Python3搭建Django框架浅析

    前言 Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django 是一个开放源代码的 Web 应用框架,由 Pyt ...

  7. Django 框架入门篇(安装与创建项目)

    什么是Django框架? 官方定义:Django是一个高级Python Web框架,鼓励快速开发和简洁实用的设计.它由经验丰富的开发人员构建,可以解决大部分Web开发的麻烦,因此您可以专注于编写应用程 ...

  8. [Python] Django框架入门

    说明:Django框架入门 当前项目环境:python3.5.django-1.11 项目名:test1 应用名:booktest 命令可简写为:python manager.py xxx => ...

  9. python的django框架与springboot_Django框架简介

    一.MVC框架和MTV框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Cont ...

最新文章

  1. 产生一定范围随机数的通用算法公式
  2. 如图两道面试题,顺便深入线程池,并连环17问
  3. 收藏 | 常见的神经网络求导总结!
  4. 使用ASP.NET MVC 2编程时遇到的两个小问题
  5. 谷歌将比特币现金汇率纳入货币信息搜索
  6. mybatis-generator 插件扩展,生成支持多种数据库的分页功能
  7. 数据库:mongodb与关系型数据库相比的优缺点zz
  8. 很多想法、很多感慨。
  9. Java并行任务框架Fork/Join
  10. SAP Spartacus的login页面路由
  11. ListView高度
  12. 3分钟通过日志定位bug,这个技能测试人必须会
  13. OpenEuler编译、安装与挂载f2fs文件系统
  14. 【软件测试】你最常用的web测试-浏览器兼容性测试
  15. java 纳秒 秒_如何使用TimeUnit枚举将纳秒转换为秒?
  16. QT Libvlc录像功能的实现(提供32位和64位库)
  17. 基于PHP+MySQL的美容会所企业资产管理系统
  18. 离职和就职的原因(一)
  19. APS携手纺织业走出低迷寒冬
  20. 当这个类被修饰public的话,为什么源文件名必须要与类名相同

热门文章

  1. Slog59_项目上线之域名备案时两家或多家运营商之间的业务交叉经历
  2. JAVA菜鸟入门HelloWorld
  3. C程序设计导引(1)
  4. Apache Kudu 加速对频繁更新数据的分析
  5. 提升NAS网速技能get:网络聚合模式
  6. 【百科】走近飞天:伏羲——资源调度服务
  7. 系统--把系统BIOS中将光驱设置为第一启动盘
  8. 页面的访问速度如何提高?(我所知道的,哪位高手有其它的高见,敬请提醒....)...
  9. 数据状态更新时的差异 diff 及 patch 机制
  10. HTTP 请求之URLs 与 URNs