Django框架之drf

一、认证组件

简介

​ 登录认证的限制

​ 认证组件是drf框架给我们提供的认证接口,它能够在请求进入视图函数/类前进验证(例如:认证用户是否登录),对不符合认证的请求进行拦截并返回校验失败的信息

1、认证组件使用步骤

模块地址:

  1. from rest_framework.authentication import BaseAuthentication

用法简介:

  1. # 1、创建一个专门用于认证的py文件,写一个类继承BaseAuthentication
  2. # 2、重写authenticate方法,在方法内验证token
  3. # 3、如果认证成功,返回两个值【返回None或两个值(当前登录的对象和token)】
  4. # 4、认证不通过,抛异常AuthenticationFailed(异常信息)
  5. # 5、局部使用和全局使用
  6. -局部使用:# 在需要使用认证的视图类下管理接口
  7. class BookDetailView(ViewSetMixin, RetrieveAPIView):
  8. authentication_classes = [LoginAuth] # 列表,可以添加多个
  9. -全局使用:# djangosetting.py文件种添加配置
  10. REST_FRAMEWORK = {
  11. 'DEFAULT_AUTHENTICATION_CLASSES':['app01.authenticate.LoginAuth']
  12. }
  13. -局部禁用:# 全局开启,局部禁用
  14. class BookDetailView(ViewSetMixin, RetrieveAPIView):
  15. authentication_classes = []

2、代码用法

认证类代码:(authentica.py)

  1. class LoginAuth(BaseAuthentication):
  2. # 在这里实现认证,如果是登录的,继续往后走返回两个值,如果不是抛异常
  3. def authenticate(self, request):
  4. # 请求中是否携带token,判断是否登录,放在地址栏中
  5. token = request.query_params.get('token', None)
  6. # 判断前端是否传入token
  7. if token:
  8. # 去表中查找token
  9. user_token = UserToken.objects.filter(token=token).first()
  10. # 判断是否查到token
  11. if user_token:
  12. # 找到了返回两个值:登录的对象和token
  13. return user_token.user, token
  14. else:
  15. # 没有登录抛异常
  16. raise AuthenticationFailed('token认证失败')
  17. else:
  18. raise AuthenticationFailed('token没传')

视图类代码

  1. # 查询所有
  2. class BookView(ViewSetMixin, ListAPIView):
  3. queryset = Book.objects.all()
  4. serializer_class = BookSerializer
  5. # 控制认证的接口(列表,可以在认证的py文件下编写多个认证)
  6. authentication_classes = [LoginAuth] # 局部认证

路由代码

  1. from django.urls import path, include
  2. from app01 import views
  3. # 第一步:导入模块
  4. from rest_framework.routers import SimpleRouter
  5. # 第二步:实例化对象
  6. router = SimpleRouter()
  7. # 第三步:注册路由
  8. router.register('books', views.BookView, 'books')
  9. urlpatterns = [
  10. path('', include(router.urls))
  11. ]

二、权限组件

简介:

​ 在我们使用的一些app或者网页中(爱奇艺,腾讯视频),都会有一些会员接口(需要购买会员才能够使用或者观看),权限组件就是对用户的这一权限进行验证,在请求进入视图类/函数代码前进行校验,校验失败后直接将请求拦截,并返回校验失败的信息

1、权限组件的使用步骤

模块地址:

  1. from rest_framework.permissions import BasePermission

用法简介:

  1. # 1、创建一个专门用于编写权限组件的py文件,写一个权限类,继承BasePermission
  2. # 2、重写has_permission方法(在该方法在中实现权限认证,在这方法中,request.user就是当前登录用户)
  3. # 3、如果有权限,返回True
  4. # 4、没有权限,返回False(定制返回的中文: self.message='中文')
  5. # 5、局部使用和全局使用
  6. -局部使用: # 在某个视图类中设置接口(不会影响别的视图类)
  7. class BookDetailView(ViewSetMixin, RetrieveAPIView):
  8. permission_classes = [CommonPermission]
  9. -全局使用: # django的settings.py中配置,影响全局
  10. REST_FRAMEWORK = {
  11. 'DEFAULT_PERMISSION_CLASSES': [
  12. 'app01.permissions.CommonPermission',
  13. ],
  14. }
  15. -局部禁用:# 全局配置局部禁用
  16. class BookDetailView(ViewSetMixin, RetrieveAPIView):
  17. permission_classes = []

2、代码用法

权限类代码(perssion.py)

  1. # 写权限类,写一个类,继承基类BasePermission,重写has_permission方法,在方法中实现权限认证,如果有权限return True ,如果没有权限,返回False
  2. from rest_framework.permissions import BasePermission
  3. class CommonPermission(BasePermission):
  4. def has_permission(self, request, view):
  5. # 实现权限的控制 ---》知道当前登录用户是谁?当前登录用户是 request.user
  6. if request.user.user_type == 1:
  7. return True
  8. else:
  9. # 没有权限,向对象中放一个属性 message
  10. # 如果表模型中,使用了choice,就可以通过 get_字段名_display() 拿到choice对应的中文
  11. self.message = '您是【%s】,您没有权限' % request.user.get_user_type_display()
  12. return False

视图类代码:

  1. class BookView(ModelViewSet):
  2. queryset = Book.objects.all()
  3. serializer_class = BookSerializer
  4. # 局部认证
  5. authentication_classes = [LoginAuth]
  6. # 权限认证(将编写的频率类导入过来)
  7. permission_classes = [CommentPermission]

三、频率

简介:

​ 频率是指,控制某个接口访问频率(次数)

1、频率组件的使用步骤

模块地址:

  1. from rest_framework.throttling import BaseThrottle, SimpleRateThrottle
  2. # BaseThrottle:需要手动编写的代码较多
  3. # SimpleRateThrottle: 需要手动编写的代码较少(用这个)

用法简介

  1. # 1、创建一个专门用来编写频率组件的py文件,写一个频率类,继承SimpleRateThrottle
  2. # 2、重写get_cache_key方法,返回什么,就以什么做限制----》ip(用户id做限制)
  3. # 3、配置一个类属性scope = 'book_5_m'
  4. # 4、在django的配置文件中编写频率次数
  5. REST_FRAMEWORK = {
  6. 'DEFAULT_THROTTLE_RATES': {
  7. 'book_5_m': '5/m', # 一分钟五次
  8. },
  9. }
  10. # 5、局部使用和全局使用
  11. -局部使用: # 只影响当前的视图类
  12. class BookView(ModelViewSet):
  13. throttle_classes = [CommentThrottle]
  14. -全局配置:影响全局
  15. REST_FRAMEWORK = {
  16. 'DEFAULT_THROTTLE_CLASSES': ['app01.throttling.CommonThrottle'],
  17. }
  18. -局部禁用:
  19. class BookView(ModelViewSet):
  20. throttle_classes = [CommentThrottle]

2、代码用法

频率类代码(throttle.py)

  1. from rest_framework.throttling import BaseThrottle, SimpleRateThrottle
  2. class CommentThrottle(SimpleRateThrottle):
  3. # 创建一个用于控制频率的变量名(需要传入配置文件)
  4. scope = 'book_5_m'
  5. def get_cache_key(self, request, view):
  6. # 返回什么就以什么做限制(request.META.get('REMOTE_ADDR')以IP做限制)
  7. return request.META.get('REMOTE_ADDR')

视图类代码

  1. class BookView(ModelViewSet):
  2. queryset = Book.objects.all()
  3. serializer_class = BookSerializer
  4. # 频率组件
  5. throttle_classes = [CommentThrottle]

django配置文件

  1. REST_FRAMEWORK = {
  2. # 控制访问频率
  3. 'DEFAULT_THROTTLE_RATES': {
  4. 'book_5_m': '5/m', # 一分钟五次
  5. },
  6. }

四、过滤的多种用法

简介:

​ 过滤是指在使用查询的时候,我们可以通过条件来过滤掉不需要的内容(例如:使用淘宝购物时,购买某种物品,过滤掉价格低于100元的商品)

  1. # restful规范中,要求了,请求地址中带过滤条件
  2. -5个接口中,只有一个接口需要有过滤和排序,查询所有接口

1、继承APIView自己写

  1. class BookView(APIView):
  2. def get(self,request):
  3. # 获取get请求携带的参数
  4. name=request.query_params.get('name')
  5. # 通过filter进行过滤
  6. books = Book.objects.filter(name=name)

2、使用drf的内置过滤(继承GenericAPIview)

模块地址:

-该方法为模糊查询

  1. from rest_framework.filters import SearchFilter

代码用法:

  1. class BookView(ModelViewSet):
  2. queryset = Book.objects.all()
  3. serializer_class = BookSerializer
  4. # 实例化过滤对象
  5. filter_backends = [SearchFilter]
  6. # 指定过滤的字段(模糊查询)
  7. search_fields = ['name', 'price']

搜索方式:

  1. # name或price中只要有关键字就会搜出来 (只能用search=xxx的方式)
  2. http://127.0.0.1:8000/api/v1/books/?search=西游记

3、使用第三方插件过滤(精准过滤)

第三方插件:

  1. # 插件名称:
  2. django-filter
  3. # 安装插件:
  4. pip3.8 install django-filter

模块地址:

  1. from django_filters.rest_framework import DjangoFilterBackend

代码用法:

  1. from rest_framework.viewsets import ModelViewSet
  2. from .models import Book
  3. from .serializer import BookSerializer
  4. from django_filters.rest_framework import DjangoFilterBackend
  5. class BookView(ModelViewSet):
  6. queryset = Book.objects.all()
  7. serializer_class = BookSerializer
  8. # 第三方过滤插件
  9. filter_backends = [DjangoFilterBackend]
  10. # 查询的字段
  11. filterset_fields = ['pk','name', 'price']

搜索方式:

  1. http://127.0.0.1:8000/api/books/?price=99
  2. http://127.0.0.1:8000/api/books/?price=99&name=呐喊

4、使用过滤组件

4、1.定制过滤组件的使用方式与步骤

模块地址:

  1. from rest_framework.filters import BaseFilterBackend

用法简介:

  1. # 1、创建一个专门用于过滤的py文件,写一个类继承BaseFilterBackend
  2. # 2、重写filter_queryset方法,在方法内部进行过滤
  3. # 3、直接返回过滤后的对象
  4. # 4、如果没有过滤直接返回所有数据
  5. # 5、局部使用
  6. -局部使用:
  7. class BookView(ViewSetMixin, ListAPIView):
  8. queryset = Book.objects.all()
  9. serializer_class = BookSerializer
  10. # 在类表内填写过滤的类
  11. filter_backends = [CommonFilter] # 可以定制多个,从左往右,依次执行

4、2.代码用法

过滤类代码(filters.py)

  1. from rest_framework.filters import BaseFilterBackend
  2. class CommonFilter(BaseFilterBackend):
  3. # 重写的类,编写过滤吧的内容
  4. def filter_queryset(self, request, queryset, view):
  5. # 获取过滤的条件
  6. filter_comment = request.query_params.get('price_gt', None)
  7. # 判断前端是否传入过滤条件
  8. if filter_comment:
  9. # 根据条件进行赛选内容
  10. books_queryset_filter = queryset.filter(price__gt=100)
  11. # 返回过滤后的数据
  12. return books_queryset_filter
  13. return queryset

视图类代码

  1. class BookView(ModelViewSet):
  2. queryset = Book.objects.all()
  3. serializer_class = BookSerializer
  4. # 第三方过滤插件
  5. filter_backends = [CommonFilter]

五、排序

1、用法简介

用法简介:

排序需要和自定义过滤继承同一个父类,需要将排序的对象填入在过滤的列表内,并且放在其他参数的前方

模块地址:

  1. from rest_framework.filters import OrderingFilter

2、代码用法

视图类代码

  1. from rest_framework.viewsets import ModelViewSet
  2. from .models import Book
  3. from .serializer import BookSerializer
  4. from django_filters.rest_framework import DjangoFilterBackend
  5. from .filters import CommonFilter
  6. from rest_framework.filters import OrderingFilter
  7. class BookView(ModelViewSet):
  8. queryset = Book.objects.all()
  9. serializer_class = BookSerializer
  10. # 第三方过滤插件(OrderingFilter放在其他过滤参数前)
  11. filter_backends = [OrderingFilter, DjangoFilterBackend, CommonFilter]
  12. # 查询的字段
  13. filterset_fields = ['id', 'name', 'price']
  14. # 指定排序的字段(-是降序,默认升序)
  15. ordering_fields = ['price']

搜索用法

  1. # 默认升序
  2. http://127.0.0.1:8000/api/books/?price_gt=60&ordering=price
  3. # 降序
  4. http://127.0.0.1:8000/api/books/?price_gt=60&ordering=-price

六、分页

1、用法简介

  • 只有查询所有接口才能到用到分页
  • drf内置了三个分页器,分别应对三种分页方式
  • 内置的分页类不能直接使用,需要继承,定制一些参数后才能使用

2、三种分页器的用法

模块地址:

​ 三种分页器在同一个父类中

  1. from rest_framework.pagination import PageNumberPagination, CursorPagination, LimitOffsetPagination

视图类代码:

  1. class BookView(ModelViewSet):
  2. queryset = Book.objects.all()
  3. serializer_class = BookSerializer
  4. # 指定分页器
  5. pagination_class = ‘指定使用的分分页器’(需要导入分页器类)

2、1.自定义分页器

  1. from rest_framework.pagination import PageNumberPagination, CursorPagination, LimitOffsetPagination
  2. # 第一种:通常用于web端(常规分页器)
  3. class CommonPageNumberPagination(PageNumberPagination):
  4. # 每页显示2条
  5. page_size = 2
  6. # page=10 查询第10页的数据,每页显示2条
  7. page_query_param = 'page'
  8. # page=10&size=5 查询第10页,每页显示5条
  9. page_size_query_param = 'size'
  10. # 每页最大显示10条
  11. max_page_size = 5
  12. # 第二种:可以控制每页显示的数量(偏移分页,用的较少)
  13. class CommonLimitOffsetPagination(CursorPagination):
  14. # 每页显示2条
  15. default_limit = 3
  16. # limit=3 取3条
  17. limit_query_param = 'limit'
  18. # offset=1 从第一个位置开始,取limit条
  19. offset_query_param = 'offset'
  20. # 最大显示数
  21. max_limit = 5
  22. # 第三种:游标分页器(app常用,拉到哪里显示多少数据)
  23. class CommonCursorPagination(CursorPagination):
  24. # 查询参数(可以随便写,需要在前端路由对上)
  25. cursor_query_param = 'p'
  26. # 每页多少条
  27. page_size = 2
  28. # 排序的字段
  29. ordering = 'id'

前端对应搜索方式:

  1. #基本分页方式(基本是这种,网页端):
  2. http://127.0.0.1:8000/api/v1/books/?page=2&size=3
  3. # 偏移分页 :从第一条开始,取4条
  4. http://127.0.0.1:8000/api/v1/books/?limit=4&offset=1
  5. # 游标分页:
  6. http://127.0.0.1:8000/api/books/?p=cD0x

Django框架之drf:7、认证组件,权限组件,频率组件,过滤的多种用法,排序,分页,的更多相关文章

  1. rest-framework框架——认证、权限、频率组件

    一.rest-framework登录验证 1.models.py添加User和Token模型 class User(models.Model): name = models.CharField(max ...

  2. Rest_Framework之认证、权限、频率组件源码剖析

    一:使用RestFramwork,定义一个视图 from rest_framework.viewsets import ModelViewSet class BookView(ModelViewSet ...

  3. restful(3):认证、权限、频率 & 解析器、路由控制、分页、渲染器、版本

    models.py中: class UserInfo(models.Model): name = models.CharField(max_length=32) psw = models.CharFi ...

  4. restframework 认证、权限、频率组件

    一.认证 1.表的关系 class User(models.Model): name = models.CharField(max_length=32) pwd = models.CharField( ...

  5. drf token刷新配置、认证组件(使用)、权限组件(使用)、频率组件(使用)、异常组件(使用)

    目录 一.特殊路由映射的请求 二.token刷新机制配置(了解) 三.认证组件项目使用:多方式登录 1.urls.py 路由 2.views.py 视图 3.serializers.py 序列化 4. ...

  6. DRF(4) - 认证、权限组件

    一.引入 通过前面三节课的学习,我们已经详细了解了DRF提供的几个重要的工具,DRF充分利用了面向对象编程的思想,对Django的View类进行了继承,并封装了其as_view方法和dispatch方 ...

  7. Django框架 之 Auth用户认证

    Django框架 之 Auth用户认证 浏览目录 auth模块 user对象 一.auth模块 1 from django.contrib import auth django.contrib.aut ...

  8. django-rest-framework 基础三 认证、权限和频率

    django-rest-framework 基础三 认证.权限和频率 目录 django-rest-framework 基础三 认证.权限和频率 1. 认证 1.1 登录接口 1.2 认证 2. 权限 ...

  9. Django框架之DRF 认证组件源码分析、权限组件源码分析、频率组件源码分析

    认证组件 权限组件 频率组件

  10. Django REST framework 自定义(认证、权限、访问频率)组件

    本篇随笔在 "Django REST framework 初识" 基础上扩展 一.认证组件 # models.py class Account(models.Model): &qu ...

随机推荐

  1. 说说switch关键字

    Switch语法 switch作为Java内置关键字,却在项目中真正使用的比较少.关于switch,还是有那么一些奥秘的. 要什么switch,我有if-else 确实,项目中使用switch比较少的 ...

  2. 设置CMD命令的初始目录

    本文提供两种方式,第一种通过打开桌面上的快捷方式实现,第二种可以通过 CMD 命令直接进入. 快捷方式 "开始 ---> 程序 ---> 附件",右键单击 " ...

  3. (译)TDD(测试驱动开发)的5个步骤

    原文:5 steps of test-driven development https://developer.ibm.com/articles/5-steps-of-test-driven-deve ...

  4. 陪你去看 Lodash.js 起步

    lodash 起步(数组) Lodash 是一个较为流行的 JavaScript 的实用工具库. 在开发过程中如果能熟练使用一些工具库提供的方法,有利于提高开发效率. 笔者从 API 上入手,不分析其 ...

  5. RabbitMq消息手动应答、放回队列重新消费、设置队列消息持久化、分发模式

    RabbitMq消息手动应答,放回队列重新消费,设置队列消息持久化 消息应答 概念 消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个长的任务并仅只完成了部分突然它挂掉了,会发生什么情况. ...

  6. mybatis-plus分页失效原因

    mybatis-plus分页失效解决方法 方法一.在启动类添加如下配置 @SpringBootApplication @MapperScan("com.**.mapper") pu ...

  7. Kubernetes基础_Service暴露的两种方式

    一.前言 kubernetes集群中,pod是多变的,可以被新建或删除,而且ip不稳定,不方便集群外部访问,所以提供了一种新的资源 Service ,就是就是 a set of Pod ,作用是提供一 ...

  8. 基于python的数学建模---logicstic回归

    樱花数据集的Logistic回归 绘制散点图 import matplotlib.pyplot as plt import numpy as np from sklearn.datasets impo ...

  9. Day20:继承详解

    继承的理解 继承:对类进行抽象化:也就是将存在的类构造成新的类: 比如说学生是一个类,老师是一个类,那么我们可以将学生类和老师类收纳进人这个类:那么学生和老师则为子类(派生类).人为父类(基类):子类 ...

  10. Class文件解析

    1 准备工作 获取class文件byte[] public static byte[] getFileBytes(File file) { try (FileInputStream fileInput ...