认证Authentication

准备工作:(需要结合权限用)

1. 需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员。

  1. python manage.py createsuperuser

2. 配置  settings.py

  1.站点语言配置

  1. # LANGUAGE_CODE = 'en-us'
  2. LANGUAGE_CODE = 'zh-hans' # 配置中文

开始认证Authentication 配置文件:

(1)可以在配置文件中配置全局默认的认证方案:

  1. REST_FRAMEWORK = {
  2. 'DEFAULT_RENDERER_CLASSES': ( # 默认响应渲染类
  3. 'rest_framework.renderers.JSONRenderer', # json渲染器
  4. 'rest_framework.renderers.BrowsableAPIRenderer', # 浏览API渲染器
  5. ),
  6.  
  7. # 认证数据的记录方式
  8. 'DEFAULT_AUTHENTICATION_CLASSES': (
  9. # 这里我们会加上jwt
  10. 'rest_framework.authentication.BasicAuthentication', # 基本认证
  11. 'rest_framework.authentication.SessionAuthentication', # session认证
  12. ),}

(2)也可以在每个视图中通过设置authentication_classess属性来设置

  1. from rest_framework.authentication import SessionAuthentication, BasicAuthentication
  2. from rest_framework.views import APIView
  3.  
  4. class ExampleView(APIView):
  5. authentication_classes = (SessionAuthentication, BasicAuthentication)
  6. ...

认证失败会有两种可能的返回值:

  • 401 Unauthorized 未认证

  • 403 Permission Denied 权限被禁止

2. 权限Permissions

权限控制可以限制用户对于视图的访问和对于具体数据对象的访问。

  • 在执行视图的dispatch()方法前,会先进行视图访问权限的判断

  • 在通过get_object()获取具体对象时,会进行模型对象访问权限的判断

使用

1.可以在配置文件中设置默认的权限管理类,如

  1. # 权限管理类
  1. REST_FRAMEWORK = {
  1. 'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated',
    ),
  1. }

如果未指明,则采用如下默认配置,在REST_FRAMEWORK ={}中:

  1. 'DEFAULT_PERMISSION_CLASSES': (
  2. 'rest_framework.permissions.AllowAny',
  3. )

2.也可以在具体的视图中通过permission_classes属性来设置,views.py 中:from rest_framework.decorators import action

  1. from rest_framework.viewsets import ModelViewSet
  2. from book.models import Book
  3. from .serializers import BookModelSerializer
  4. # 用户认证
  5. from rest_framework.authentication import BaseAuthentication,SessionAuthentication
  6. # 权限
  7. from rest_framework.permissions import IsAuthenticated
  8. from rest_framework.permissions import BasePermission
  9. # 自定义权限 ,必须继承 BasePermission
  10. class CustomPermission(BasePermission):
  11. def has_permission(self, request, view):
  12. # 当前权限方法用于判断访问者是否有权限访问对应的视图
  13. # 获取当前已经登录的用户可以用request.user
  14. return request.user.username=='wang' # 返回的是布尔值
  15. # 视图:
  16. class BookModelSetView(ModelViewSet):
  17. queryset = Book.objects.all()
  18. serializer_class = BookModelSerializer
  19. # 只是设置了认证方式,还需要结合权限来 ,这里会报错, .authenticate() must be overridden.
  20. #authentication_classes = [SessionAuthentication,BaseAuthentication]
  21. # 权限
  22. # permission_classes = [IsAuthenticated]
  23. permission_classes = [CustomPermission]

提供的权限

  • AllowAny 允许所有用户

  • IsAuthenticated 仅通过认证的用户

  • IsAdminUser 仅管理员用户

  • IsAuthenticatedOrReadOnly 已经登陆认证的用户可以对数据进行增删改操作,没有登陆认证的只能查看数据。

自定义权限

如需自定义权限,需继承rest_framework.permissions.BasePermission父类,并实现以下两个任何一个方法或全部

  • has_permission(self, request, view)

    是否可以访问视图, view表示当前视图对象

  • .has_object_permission(self, request, view, obj)

    是否可以访问数据对象, view表示当前视图, obj为数据对象

例如:

  1. class MyPermission(BasePermission):
  2. def has_object_permission(self, request, view, obj):
  3. """控制对obj对象的访问权限,此案例决绝所有对对象的访问"""
  4. return False

  5. class BookInfoViewSet(ModelViewSet):
  6. queryset = BookInfo.objects.all()
  7. serializer_class = BookInfoSerializer
  8. permission_classes = [IsAuthenticated, MyPermission]

3. 限流Throttling

可以对接口访问的频次进行限制,以减轻服务器压力。

使用

1. 可以在配置文件中,使用DEFAULT_THROTTLE_CLASSESDEFAULT_THROTTLE_RATES进行全局配置,

  1. REST_FRAMEWORK = {
  1. # 限流
    'DEFAULT_THROTTLE_CLASSES': (
    'rest_framework.throttling.AnonRateThrottle',# 普通用户
    'rest_framework.throttling.UserRateThrottle' # 登录用户
    ),
    'DEFAULT_THROTTLE_RATES': {
    'anon': '3/day', # 一天只能访问3次
    'user': '5/day' # 一天只能访问5次
    },
  1. }

DEFAULT_THROTTLE_RATES 可以使用 second, minute, hourday来指明周期。

2.也可以在具体视图中通过throttle_classess属性来配置,如

  1. from rest_framework.response import Response
  2. from rest_framework.viewsets import ModelViewSet
  3. from book.models import Book
  4. from .serializers import BookModelSerializer
  5.  
  6. # 限流
  7. from rest_framework.throttling import AnonRateThrottle,UserRateThrottle
  8. class BookModelSetView(ModelViewSet):
  9. queryset = Book.objects.all()
  10. serializer_class = BookModelSerializer
  11. # 限流
  12. throttle_classes = [AnonRateThrottle,UserRateThrottle]

可选限流类

1) AnonRateThrottle

限制所有匿名未认证用户,使用IP区分用户。

使用DEFAULT_THROTTLE_RATES['anon'] 来设置频次

2)UserRateThrottle

限制认证用户,使用User id 来区分。

使用DEFAULT_THROTTLE_RATES['user'] 来设置频次

3)ScopedRateThrottle

限制用户对于每个视图的访问频次,使用ip或user id。

例如:

  1. class ContactListView(APIView):
  2. throttle_scope = 'contacts'
  3. ...

  4. class ContactDetailView(APIView):
  5. throttle_scope = 'contacts'
  6. ...

  7. class UploadView(APIView):
  8. throttle_scope = 'uploads'
  9. ...
  10. REST_FRAMEWORK = {
  11. 'DEFAULT_THROTTLE_CLASSES': (
  12. 'rest_framework.throttling.ScopedRateThrottle',
  13. ),
  14. 'DEFAULT_THROTTLE_RATES': {
  15. 'contacts': '1000/day',
  16. 'uploads': '20/day'
  17. }
  18. }

4. 过滤Filtering

对于列表数据可能需要根据字段进行过滤,我们可以通过添加django-fitlter扩展来增强支持。

  1. pip install django-filter

1.在配置文件中增加过滤后端的设置:

  1.注册应用:

  1. INSTALLED_APPS = [
  2.  
  3. 'django_filters', # 需要注册应用,
  4. ]

  2.配置

  1. # drf框架的配置字典,所以关于drf的配置信息,要记录在这里即可。
  2. REST_FRAMEWORK = {
  3.  
  4. 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',),

  5. }

在视图中添加filter_fields属性,指定可以过滤的字段

  1. 访问时:127.0.0.1:8000/books/?btitle=西游记
  1. from rest_framework.response import Response
  2. from rest_framework.viewsets import ModelViewSet
  3. from book.models import Book
  4. from .serializers import BookModelSerializer
  5. # 过滤排序
  6. from rest_framework.filters import OrderingFilter
  7.  
  8. class BookModelSetView(ModelViewSet):
  9.  
  10. queryset = Book.objects.all()
  11.  
  12. serializer_class = BookModelSerializer
  13. # 过滤
  14. filter_fields = ('title', 'bread')

5. 排序

对于列表数据,REST framework提供了OrderingFilter过滤器来帮助我们快速指明数据按照指定字段进行排序。

使用方法:

在类视图中设置filter_backends,使用rest_framework.filters.OrderingFilter过滤器

REST framework会在请求的查询字符串参数中检查是否包含了ordering参数,如果包含了ordering参数,

则按照ordering参数指明的排序字段对数据集进行排序。

前端可以传递的ordering参数的可选字段值需要在ordering_fields中指明。

示例:

  1. # 127.0.0.1:8000/books/?ordering=-bread
  1. from rest_framework.response import Response
  2. from rest_framework.viewsets import ModelViewSet
  3. from book.models import Book
  4. from .serializers import BookModelSerializer
  5.  
  6. # 过滤排序
  7. from rest_framework.filters import OrderingFilter
  8.  
  9. class BookModelSetView(ModelViewSet):
  10.  
  11. queryset = Book.objects.all()
  12. serializer_class = BookModelSerializer
  13. # 过滤
  14. filter_fields = ('title', 'bread')
  15. # 过滤排序
  16. filter_backends = [OrderingFilter]
  17. OrderingFilter=['id','bread','bcommnet']

6. 分页Pagination

REST framework提供了分页的支持。

1.可以在配置文件中设置全局的分页方式,如:

  1. # drf框架的配置字典,所以关于drf的配置信息,要记录在这里即可。
  2. REST_FRAMEWORK = {
  3. # 分页配置[全局配置,针对整个项目所有列表视图都会产生分页效果]
  4. 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
  5. 'PAGE_SIZE': 2, # 每页数目
  6. }

2.也可通过自定义Pagination类,来为视图添加不同分页行为。在视图中通过pagination_clas属性来指明。

  1. from rest_framework.response import Response
  2. from rest_framework.viewsets import ModelViewSet
  3. from book.models import Book
  4. from .serializers import BookModelSerializer
  5. # 自定义分页器
  6. from rest_framework.pagination import PageNumberPagination
  7. class BookPageNumberPagination(PageNumberPagination):
  8. page_size = 3
  9. max_page_size = 10
  10. page_query_param = 'page_size'
  11. ## http;//loclahost/?page_size=5
  12.  
  13. class BookModelSetView(ModelViewSet):
  14. queryset = Book.objects.all()
  15. serializer_class = BookModelSerializer
  16. # 分页
  17. # 指定当前视图类的列表视图[局部配置]
  18. # pagination_class = BookPageNumberPagination
  19. pagination_class = None # 阻止全局的分页配置给当前的列表视图生成分页效果

注意:如果在视图内关闭分页功能,只需在视图内设置

  1. pagination_class = None

可选分页器

1) PageNumberPagination

前端访问网址形式:

  1. GET  http://api.example.org/books/?page=4

可以在子类中定义的属性:

  • page_size 每页数目

  • page_query_param 前端发送的页数关键字名,默认为"page"

  • page_size_query_param 前端发送的每页数目关键字名,默认为None

  • max_page_size 前端最多能设置的每页数量

view.py 视图中:

  1. from rest_framework.pagination import PageNumberPagination

  2. class StandardPageNumberPagination(PageNumberPagination):
  3. page_size_query_param = 'page_size'
  4. max_page_size = 10

  5. class BookListView(ListAPIView):
  6. queryset = BookInfo.objects.all().order_by('id')
  7. serializer_class = BookInfoSerializer
  8. pagination_class = StandardPageNumberPagination

  9. # 127.0.0.1/books/?page=1&page_size=2

2)LimitOffsetPagination

前端访问网址形式:

  1. GET http://api.example.org/books/?limit=100&offset=400

可以在子类中定义的属性:

  • default_limit 默认限制,默认值与PAGE_SIZE设置一直

  • limit_query_param limit参数名,默认'limit'

  • offset_query_param offset参数名,默认'offset'

  • max_limit 最大limit限制,默认None

  1.  

drf 认证、权限、限流、过滤、排序、分页器的更多相关文章

  1. 三 drf 认证,权限,限流,过滤,排序,分页,异常处理,接口文档,集xadmin的使用

    因为接下来的功能中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py createsuperuser 创建管理员以后,访问admin站点 ...

  2. day74:drf:drf其他功能:认证/权限/限流/过滤/排序/分页/异常处理&自动生成接口文档

    目录 1.django-admin 2.认证:Authentication 3.权限:Permissions 4.限流:Throttling 5.过滤:Filtering 6.排序:OrderingF ...

  3. django-rest-framework-源码解析004-三大验证(认证/权限/限流)

    三大验证模块概述 在DRF的APIView重写的dispatch方法中,  self.initial(request, *args, **kwargs) 这句话就是执行三大验证的逻辑, 点进去可以看到 ...

  4. (四) DRF认证, 权限, 节流

    一.Token 认证的来龙去脉 摘要 Token 是在服务端产生的.如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端.前端可以在每次请求的时候带上 To ...

  5. DRF 认证 权限 视图 频率

    认证组件 使用:写一个认证类,继承BaseAuthentication 在类中写authenticate方法,把request对象传入 能从request对象中取出用户携带的token根据token判 ...

  6. SpringCloud(8)---zuul权限校验、接口限流

    zuul权限校验.接口限流 一.权限校验搭建 正常项目开发时,权限校验可以考虑JWT和springSecurity结合进行权限校验,这个后期会总结,这里做个基于ZuulFilter过滤器进行一个简单的 ...

  7. 45.限流Throttling及源码解析

    什么是限流? 限流类似于权限机制,它也决定是否接受当前请求,用于控制客户端在某段时间内允许向API发出请求的次数,也就是频率 假设有客户端(比如爬虫程序)短时间发起大量请求,超过了服务器能够处理的能力 ...

  8. Sentinel限流实现原理

    Sentinel限流的神秘面纱: 之前我们学习过限流比较主流的三种算法:漏桶,令牌桶,滑动窗口.而Sentinel采用的是最后一种,滑动窗口来实现限流的. 通过对Sentinel基础Api的使用,我们 ...

  9. 2. DRF 认证、权限、限流、分页、过滤、序列 化

    2.1 user/urls.py   ModelViewSet注册路由三部曲 from django.urls import include, path from user import views ...

随机推荐

  1. centos在图形界面和命令行之间切换的快捷键是什么?

    答: ctrl+alt+F1 或者ctrl+alt+F2 1.当前处于图形界面时,按ctrl+alt+F2可进入命令行模式 2. 当前处于命令行模式,按ctrl+alt+F1可进入图形界面

  2. 【做题】UVA-12304——平面计算集合六合一

    可真是道恶心题-- 首先翻译一下6个任务: 给出一个三角形,求它的外界圆. 给出一个三角形,求它的内接圆. 给出一个圆和一个点,求过这个点的切线的倾斜角\(\alpha \in [0,180)\).( ...

  3. 这几道Java集合框架面试题几乎必问

    Arraylist 与 LinkedList 异同 补充:数据结构基础之双向链表 ArrayList 与 Vector 区别 HashMap的底层实现 JDK1.8之前 JDK1.8之后 HashMa ...

  4. 题解——UVA11997 K Smallest Sums

    题面 背景 输入 输出 翻译(渣自翻) 给定K个包含K个数字的表,要求将其能产生的\( k^{k} \)个值中最小的K个输出出来 题解 k路归并问题的经典问题 可以转化为二路归并问题求解 考虑A[], ...

  5. iframe初始化属性

    <iframe id="user" src="xxx.html" frameborder="0" width="" ...

  6. Latex citation using natbib and footnotesize

    References: Natbib bibliography styles How to change font size for bibliography? Latex citation usin ...

  7. HDU 4496 D-City(逆向并查集)

    http://acm.hdu.edu.cn/showproblem.php?pid=4496 题意: 给出n个顶点m条边的图,每次选择一条边删去,求每次删边后的连通块个数. 思路: 离线处理删边,从后 ...

  8. gitlab git

    git网站是进不去的需要加权限才能进去!!!!!!!! 登录进去后 ssh-keygen -t rsa -C "gitlab用户名一般是邮箱" 一路设置好 Use the code ...

  9. 解決 Android Studio 不停 Indexing 的問題(Updating Indices: Indexing paused due to batch update)

    遇到這個問題通常是 IDE 更新後,或是反覆使用 Android Studio 開啟其他專案所導致,解決方法其實非常簡單喔! 点击 這個選項的功用是「清除 IDE 暫存並重啟」,沒錯,會出現上述情形的 ...

  10. idea创建web聚合工程(2)

    参考文档: intelj idea 创建聚合项目(典型web项目,包括子项目util.dao.service) 使用IntelliJ IDEA创建Maven聚合工程.创建resources文件夹.ss ...