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.?动?成接??档

相关源码连接:

github,技术交流,欢迎指教

原文地址:https://www.cnblogs.com/x931890193/p/9330940.html

时间: 2024-10-09 07:15:34

django 学习之DRF (三)的相关文章

Django学习笔记(三)—— 模型 model

疯狂的暑假学习之 Django学习笔记(三)-- 模型 model 参考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # 用什么数据库管理系统 'NAME': '', # 数据库名称,如果用sqlite,要写完整路径 'USER': '', # 如果用sqlite,这个不用写 'PASSWORD': '', # 如果用sqlite,这个不用写

django 学习之DRF (二)

Django学习之DRF02 Serializer序列化器之反序列化操作    1.调?序列化器进?验证        0.准备序列化器            class BookInfoSerializer(serializers.Serializer):            """图书数据序列化器"""                id = serializers.IntegerField(label= 'ID', read_only=

Django学习笔记(三)

在polls/urls.py文件中键入如下代码: polls/urls.py from django.conf.urls import url from . import views urlpatterns = [ url(r'^$', views.index, name='index'), ] 下一步,让主URLconf可以链接到polls.urls模块.在mysite/urls.py中插入一个include(): mysite/urls.py from django.conf.urls im

Django 学习笔记(三)模板导入

本章内容是将一个html网页放进模板中,并运行服务器将其展现出来. 平台:windows平台下Liunx子系统 目前的目录: hello ├── manage.py ├── hello │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── HelloWorld ├── __init__.py ├── admin.py ├── apps.py ├── models.py ├── tests.py └── views.

Python框架之Django学习笔记(三)

开始一个项目 第一次使用 Django,必须进行一些初始化设置工作. 新建一个工作目录,例如 D:\tool\python\Python27\workspace\djcode,然后进入该目录. 转到创建的目录,运行命令django-admin.py startproject myfirstsite.这样会在当前目录下创建一个目录:myfirstsite(PS:名字随便起). startproject 命令创建一个目录,进入文件可以看到一个文件夹和一个文件: 1 myfirstsite/ 2 my

(转)Django学习之 第三章:动态Web页面基础

上一章我们解释了怎样开始一个Django项目和运行Django服务器 当然了,这个站点实际上什么也没有做------除了显示了"It worked"这条信息以外. 这一章我们介绍怎样使用Django创建动态网页 你的第一个视图:动态内容 让我们创建一个显示当前日期和时间的Web页面来作为你的第一个目标 这是一个动态Web页面的例子,因为页面内容根据计算当前时间而变化 这个例子不需要数据库和任何用户输入,只是输出服务器内部时钟 我们将写一个视图方法,它只是一个Python方法,接受Web

django学习之Model(三)QuerySet

接下来主要学习Models中的Making queries 写好models.py后,django会自动提供一个数据库的抽象API,来实现CRUD(create, retrieve, update, delete).这一部分主要就是怎样去用这些API.在data model reference会有全部的讲解. 接下来都会反复用到下边这个例子,或者在这段代码上进行扩展: from django.db import models class Blog(models.Model): name = mo

Django 学习笔记(七)数据库基本操作(增查改删)

一.前期准备工作,创建数据库以及数据表,详情点击<Django 学习笔记(六)MySQL配置> 1.创建一个项目 2.创建一个应用 3.更改settings.py 4.更改models.py 5.同步数据 二.安装IPython方便debug sudo apt-get install ipython3 安装成功后用python manage.py shell 会自动进入Ipython交互解释器中,没有安装Ipython只有前两行代码,只进入到Python shell 中. Python 3.5

Django学习小组出品:一起来做一个简单的Blog第一周文档(教程)

本节是 django blog 项目的开篇,是 django 学习小组的集体学习成果.django学习小组是由我发起的一个促进 django 新手互相学习.互相帮助的组织.小组在一边学习 django 的同时将一起完成三个项目: 一个简单django blog,用于发布小组每周的学习和开发文档 django中国社区,为国内的 django 开发者们提供一个长期维护的 django 社区,聚集全国的 django 开发者到这个社区上来 django 问答社区, 类似于segmentfault 和