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.?动?成接??档
相关源码连接:
原文地址:https://www.cnblogs.com/x931890193/p/9330940.html