django 学习之DRF (三)
Django学习之DRF-03
视图集
1.视图集介绍
2.视图集基本使⽤
1.需求 使⽤视图集获取列表数据和单⼀数据
2.实现
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet): """使⽤视图集实现返回列表数据和单⼀数据""" queryset = BookInfo.objects.all() serializer_class = BookInfoSerializer
1.视图
2.序列化器
可使⽤之前定义过的序列化器
class BookInfoSerializer(serializers.Serializer): pass class BookInfoModelSerializer(serializers.ModelSerializer): pass
3.路由
# 演示viewset
url(r'^books/$', views.BookInfoViewSet.as_view({'get': 'list'})), url(r'^books/(?P<pk>\d+)/$', views.BookInfoViewSet.as_view({'get': 'retrieve'})),
3.视图集中定义附加action动作
1.需求
追加读取倒叙后的最新数据逻辑
追加修改阅读量的逻辑
2.实现
1.视图
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet): """使⽤视图集实现返回列表数据和单⼀数据""" queryset = BookInfo.objects.all() serializer_class = BookInfoSerializer # 以下代码: 演示附加action逻辑 def latest(self, request): """ 返回最新的图书信息 """ book = BookInfo.objects.latest('id') serializer = self.get_serializer(book) return Response(serializer.data) def read(self, request, pk): """ 修改图书的阅读量数据 """ book = self.get_object() book.bread = request.data.get('read') book.save() serializer = self.get_serializer(book) return Response(serializer.data)
2.路由
# 演示viewset url(r'^books/$', views.BookInfoViewSet.as_view({'get': 'list'})), url(r'^books/(?P<pk>\d+)/$', views.BookInfoViewSet.as_view({'get': 'retrieve'})), # 演示附加action url(r'^books/latest/$', views.BookInfoViewSet.as_view({'get': 'latest'})), url(r'^books/(?P<pk>\d+)/read/$', views.BookInfoViewSet.as_view({'put': 'read'})),
4.路由Routers
1.介绍
REST framework提供了两个router
• SimpleRouter
• DefaultRouter
2.需求 使⽤DefaultRouter定义路由
3.实现
1.原有路由
# 演示viewset
url(r'^books/$', views.BookInfoViewSet.as_view({'get': 'list'})),
url(r'^books/(?P<pk>\d+)/$', views.BookInfoViewSet.as_view({'get': 'retrieve'})),
# 演示附加action
url(r'^books/latest/$', views.BookInfoViewSet.as_view({'get': 'latest'})),
url(r'^books/(?P<pk>\d+)/read/$', views.BookInfoViewSet.as_view({'put': 'read'})),
2.视图集中附加action的声明
3.DefaultRouter定义路由
# 创建路由对象
router = DefaultRouter()
# 将视图集注册到路由
router.register(r'books', views.BookInfoViewSet, base_name= 'book')
# 视图集路由添加到urlpatterns
urlpatterns += router.urls
视图⾼级⽤法
1.认证Authentication
1.说明 识别登录⽤户是谁
2.配置
# DRF配置
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.BasicAuthentication', # 基本认证 'rest_framework.authentication.SessionAuthentication', # session认证 ) }
3.补充
认证失败会有两种可能的返回值:
• 401 Unauthorized 未认证
• 403 Permission Denied 权限被禁⽌
2.权限Permissions
1.说明
权限控制可以限制⽤户对于视图的访问和对于具体数据对象的访问。
• 在执⾏视图的dispatch()⽅法前,会先进⾏视图访问权限的判断
• 在通过get_object()获取具体对象时,会进⾏对象访问权限的判断
限制⽤户的权限
提供的权限
• AllowAny 允许所有⽤户
• IsAuthenticated 仅通过认证的⽤户
• IsAdminUser 仅管理员⽤户
• IsAuthenticatedOrReadOnly 认证的⽤户可以完全操作,否则只能get读取
2.视图访问权限
1.全局权限
REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ) }
2.局部权限
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
"""使⽤视图集实现返回列表数据和单⼀数据"""
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
# 权限认证: 只有登录⽤户才能访问
permission_classes = [IsAuthenticated]
pass
3.⾃定义权限
1.说明
如需⾃定义权限,需继承rest_framework.permissions.BasePermission⽗类,并实现以下两个任何⼀个⽅法或全部
• .has_permission(self, request, view)
是否可以访问视图, view表示当前视图对象
• .has_object_permission(self, request, view, obj)
是否可以访问数据对象, view表示当前视图, obj为数据对象
2.实现
class MyPermission(BasePermission): def has_object_permission(self, request, view, obj): """控制对obj对象的访问权限,此案例决绝所有对对象的访问""" return False class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet): """使⽤视图集实现返回列表数据和单⼀数据""" queryset = BookInfo.objects.all() serializer_class = BookInfoSerializer # 权限认证: 只有登录⽤户才能访问,且⽆权访问单⼀对象 permission_classes = [IsAuthenticated, MyPermission] pass
3.限流Throttling
1.说明 可以对接⼝访问的频次进⾏限制,以减轻服务器压⼒。
2.配置
DEFAULT_THROTTLE_RATES 可以使⽤ second, minute, hour 或 day来指明周期。 # DRF配置 REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES': ( 'rest_framework.throttling.AnonRateThrottle', # 匿名⽤户限流 'rest_framework.throttling.UserRateThrottle' # 登录⽤户限流 ), 'DEFAULT_THROTTLE_RATES': { 'anon': '1/minute', # 匿名⽤户限流 'user': '3/minute' # 登录⽤户限流 } }
4.过滤Filtering
1.安装过滤模块 pip install django-filter
2.注册应⽤
INSTALLED_APPS = [ ' django.contrib.admin' , ' django.contrib.auth' , ' django.contrib.contenttypes' , ' django.contrib.sessions' , ' django.contrib.messages' , ' django.contrib.staticfiles' , 'rest_framework', # DRF ' django_filters' , # DRF过滤 'users.apps.UsersConfig', # 安装users应⽤, 演示基本使⽤ 'request_response.apps.RequestResponseConfig', # 演示请求和响应 ' booktest.apps.BooktestConfig' , # 图书英雄管理应⽤ ]
3.配置过滤后端
# DRF配置 REST_FRAMEWORK = { # 过滤后端 'DEFAULT_FILTER_BACKENDS': (' django_filters.rest_framework.DjangoFilterBackend' ,) }
4.视图添加过滤字段
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet): """使⽤视图集实现返回列表数据和单⼀数据""" queryset = BookInfo.objects.all() serializer_class = BookInfoSerializer # 权限认证: 只有登录⽤户才能访问,且⽆权访问单⼀对象 permission_classes = [IsAuthenticated, MyPermission] # 过滤字段 filter_fields = (' btitle' , 'bread')
5.测试 http://127.0.0.1:8000/books/?btitle= ⻄游记
http://127.0.0.1:8000/books/?bread=10
5.排序OrderingFilter
6.分⻚Pagination
7.版本Versioning
8.异常处理 Exceptions
9.⾃动⽣成接⼝⽂档
相关源码连接:
django 学习之DRF (三)的更多相关文章
- Django学习笔记(三)—— 型号 model
疯狂暑期学习 Django学习笔记(三)-- 型号 model 參考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'defaul ...
- django 学习之DRF (二)
Django学习之DRF02 Serializer序列化器之反序列化操作 1.调⽤序列化器进⾏验证 0.准备序列化器 class BookInfoSerializer(serial ...
- Django 学习笔记(三)模板导入
本章内容是将一个html网页放进模板中,并运行服务器将其展现出来. 平台:windows平台下Liunx子系统 目前的目录: hello ├── manage.py ├── hello │ ├── _ ...
- django 学习之DRF (一)
Django框架基础DRF-01 前后端分离介绍 1.前后端不分离图解 2.前后端分离图解 3.为什么要学习DRF DRF可以帮助我们开发者快速的开发⼀个依托于Django的前后后端分离 ...
- Django 学习笔记(三) --- HTML 模版加载 css、js、img 静态文件
人生苦短 ~ Tips:仅适用于 Python 3+(反正差别不大,py2 改改也能用).因为据 Python 之父 Guido van Rossum 说会在 2020 年停止对 Python 2 的 ...
- Django学习笔记第三篇--关于响应返回
一.返回简单类型: #1.返回简单字符串 #from django.http import HttpResponse return HttpResponse("return string&q ...
- django学习笔记(三)模型
1.创建一个django app: python manage.py startapp books 2.validate 命令检查你的模型的语法和逻辑是否正确.一旦你觉得你的模型可能有问题,运行 py ...
- python Django 学习笔记(三)—— 模版的使用
模版基本介绍 模板是一个文本,用于分离文档的表现形式和内容. 模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签). 模板通常用于产生HTML,但是Django的模板也能产生任何 ...
- python之Django学习笔记(三)---URL调度/URL路由
在django中,用户发起url请求消息首先到工程的urls.py中查找是否有匹配的url路径 刚创建好的工程中urls.py只有下面几行代码: from django.contrib import ...
随机推荐
- 引用 WCF 服务后,没有生成任何 .datasource?
如题WCF服务生成成功,在添加服务引用的时候也不报错,但是添加完成之后不能正常调用服务借口. 在重新引用服务的时候,或者是是更新引用服务的时候,点“高级”按钮,在服务引用设置对话框中,将“重新使用引用 ...
- Caused by: java.lang.IncompatibleClassChangeError: Implementing class
Caused by: java.lang.IncompatibleClassChangeError: Implementing class 可能是导入的jar包重复. 尤其在Maven引用中,请查看是 ...
- 生产者与消费者---demo2---boke
假设有这样一种情况,有一个桌子,桌子上面有一个盘子,盘子里只能放一颗鸡蛋,A专门往盘子里放鸡蛋,如果盘子里有鸡蛋,则一直等到盘子里没鸡蛋,B专门从盘子里拿鸡蛋,如果盘子里没鸡蛋,则等待直到盘子里有鸡蛋 ...
- SEO中常用HTML代码大全,及权重排序
做SEO必须要懂HTML,说的是一点都没错,不过其实是不需要全部都懂,最重点的你懂了会用,基本上都是事半功倍了.可以这么说一个不懂代码的优化人员不算是一个合格的好优化.下面就总结一下做优化,必须要懂得 ...
- C Primer Plus学习笔记(四)- 运算符、表达式和语句
基本运算符 赋值运算符:= 在C语言中,=不是“相等”,而是赋值运算符,把左边的值赋给右边的变量 a = 2018; //把值2018赋给变量a 赋值表达式语句的目的是把值储存到内存位置上,用于储存值 ...
- redis学习五 集群配置
redis集群配置 0,整体概述 整体来说就是: 1,安装redis 2,配置多个redis实例 3,安装 ruby和rubygems 4,启动red ...
- java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和总结
在web开发中,避免不了对日期的操作,就几种常见的日期操作做个总结(部分参考网络,在此表示感谢): java.util.Date.java.sql.Date.java.sql.Time.java.sq ...
- Tiny4412 Linux 内核启动流程
Linux内核的启动分为压缩内核和非压缩内核两种,这里我们以压缩内核为例.压缩内核运行时,将运行一段解压缩程序,得到真正的内核镜像,然后跳转到内核镜像运行.此时,Linux进入非压缩内核入口,在非压缩 ...
- X—shell的安装以及与Linux的链接(http://www.cnblogs.com/v-weiwang/p/5029559.html)
X—shell作为一种强大的远程操作工具,使我们能够简单的去操作虚拟机,因此呢我们最好是能够在我们的电脑上进行安装. X—shell作为一个工具我们无论什么版本的都可以,在安装的时候呢也特别的简单,但 ...
- volatile关键字在多线程中的作用