首页 > 其他分享 >认证组件、权限组件、权限的使用、频率组件、使用步骤、过滤排序、分页

认证组件、权限组件、权限的使用、频率组件、使用步骤、过滤排序、分页

时间:2023-02-07 14:55:24浏览次数:37  
标签:排序 登录 ViewSetMixin 视图 token 接口 组件 权限 class

上节课回顾

# 1 两个视图基类
	APIView
    GenericAPIView:跟数据库打交道,而且需要序列化反序列化,可以使用它
    
# 2 5 个视图扩展类+GenericAPIView   = 视图类
	-list
    -retrieve
    -destroy
    -create
    -update
    
    -正常需要写两个视图类,实现5个接口
    	-BookView:list,create
        -BookDetailView:retrieve,destroy,update
        -5个接口只想写新增和更新----》两个视图类
        -如果配合自动生成路由:ViewSetMixin+list+update+GenericAPIView  可以写到一个视图类中
        -5个接口:自动生成路由+5个视图扩展类+GenericAPIView---》一个视图类即可
# 3 9个视图子类   视图类
	-5个,两两组合,三个组合
    
    
# 4 视图集
	-ModelViewSet
    -ReadOnlyModelViewSet
    -ViewSetMixin:不是视图类,配合视图类一起用,重写了as_view---》路由写法变了--》本质就是通过传的actions做映射{'get':"xxx"}
        -传actions方式
        -自动生成方法
        
   -继承APIView+自动生成路由----》ViewSet
   -继承GenericAPIView+自动生成路由----》GenericViewSet
    
    
   -引申出来:后期在视图类中的方法,可以任意命名,只要做好映射,或自动生成即可


# 5 路由组件
	-三种写法
    	-传统写法:不继承ViewSetMixin及其子类的
        -映射写法:传actions
        -自动生成写法:两个类,加入到路由中:两种(include,列表直接加)
        
   -action装饰器
	-自动生成路由时,做自动生成,装饰在视图类的方法上
    @action(methods=['POST','GET'],detail=False)   
    
    
# 7 登录接口---》自动生成路由,
	-ViewSetMixin+APIView   login  ---》使用action装饰器装饰---》post请求
    -取出前端传入的数据(三种格式都可以)---》request.data
    -写逻辑判断是否登录成功----》UserToken存储登录状态
    	-如果存在修改,不存在就更新
    -返回给前端

今日内容

1 认证组件

# 以后,有的接口需要登录后才能访问,有的接口,不登录就能访问
	-登录认证的限制
    
    
# 写一个登录接口,返回token,以后只要带着token过来,就是登录了,不带,就没有登录



# 查询所有不需要登录就能访问
# 查询单个,需要登录才能访问

1.1 认证组件使用步骤

# 1 写一个认证类,继承BaseAuthentication
# 2 重写authenticate方法,在该方法在中实现登录认证:token在哪带的?如果认证它是登录了
# 3 如果认证成功,返回两个值【返回None或两个值】
# 4 认证不通过,抛异常AuthenticationFailed
# 5 局部使用和全局使用
	-局部:只在某个视图类中使用【当前视图类管理的所有接口】
        class BookDetailView(ViewSetMixin, RetrieveAPIView):
            authentication_classes = [LoginAuth] 
    -全局:全局所有接口都生效(登录接口不要)
    REST_FRAMEWORK = {
    	'DEFAULT_AUTHENTICATION_CLASSES':['app01.authenticate.LoginAuth']
	}
    
    -局部禁用:
    	 class BookDetailView(ViewSetMixin, RetrieveAPIView):
            authentication_classes = [] 

1.1 代码

### 视图
# 查询所有
class BookView(ViewSetMixin, ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer


# 查询单个
class BookDetailView(ViewSetMixin, RetrieveAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    # authentication_classes = [LoginAuth]  # 需要写一个认证类,需要咱们写


### 认证类代码

class LoginAuth(BaseAuthentication):
    def authenticate(self, request):
        # 在这里实现认证,如果是登录的,继续往后走返回两个值,如果不是抛异常
        # 请求中是否携带token,判断是否登录,放在地址栏中
        token = request.query_params.get('token', None)
        if token:  # 前端传入token了,去表中查,如果能查到,登录了,返回两个值[固定的:当前登录用户,token]
            user_token = UserToken.objects.filter(token=token).first()
            if user_token:
                return user_token.user, token
            else:
                # 没有登录抛异常
                raise AuthenticationFailed('token认证失败')
        else:
            raise AuthenticationFailed('token没传')

            
            
### 路由代码
router.register('books', views.BookView, 'books')
router.register('books', views.BookDetailView, 'books')
# 坑
	-不要在配置文件中乱导入不使用的东西,否则会报错

2 权限组件

# 即便登录成功了,有些接口,还是不能访问,因为没有权限

# 登录后,有的接口有权限访问,有的没有权限访问

# 查询单个和查询所有,都要登录才能访问----》全局认证
	-查询单个需要超级管理员才能访问
    -查询所有,所有登录用户都能访问
    
    
# 权限是一个字段,在User表中,加入user_type字段

2.1 权限的使用

# 1 写一个权限类,继承BasePermission
# 2 重写has_permission方法,在该方法在中实现权限认证,在这方法中,request.user就是当前登录用户
# 3 如果有权限,返回True
# 4 没有权限,返回False,定制返回的中文: self.message='中文'
# 5 局部使用和全局使用
	-局部:只在某个视图类中使用【当前视图类管理的所有接口】
        class BookDetailView(ViewSetMixin, RetrieveAPIView):
    		permission_classes = [CommonPermission]
    -全局:全局所有接口都生效
          REST_FRAMEWORK = {
            'DEFAULT_PERMISSION_CLASSES': [
                'app01.permissions.CommonPermission',
            ],

        }
    
    -局部禁用:
    	 class BookDetailView(ViewSetMixin, RetrieveAPIView):
            permission_classes = [] 

3 频率组件

# 控制某个接口访问频率(次数)


# 查询所有接口,同一个ip一分钟只能访问5次


3.1 使用步骤

# 1 写一个频率类,继承SimpleRateThrottle
# 2 重写get_cache_key方法,返回什么,就以什么做限制----》ip,用户id做限制
# 3 配置一个类属性:scope = 'book_5_m'
# 4 在配置文件中配置
  'DEFAULT_THROTTLE_RATES': {
        'book_5_m': '5/m',
    },
# 5 局部使用和全局使用
	-局部:只在某个视图类中使用【当前视图类管理的所有接口】
        class BookDetailView(ViewSetMixin, RetrieveAPIView):
    		throttle_classes = [CommonThrottle]
    -全局:全局所有接口都生效
          REST_FRAMEWORK = {
             'DEFAULT_THROTTLE_CLASSES': ['app01.throttling.CommonThrottle'],

        }
    
    -局部禁用:
    	 class BookDetailView(ViewSetMixin, RetrieveAPIView):
            throttle_classes = [] 

4 过滤排序

# restful规范中,要求了,请求地址中带过滤条件
	-5个接口中,只有一个接口需要有过滤和排序,查询所有接口
    
    
# 查询 所有图书接口,查询以  红  开头的所有图书

4.0 继承APIView 自己写(伪代码,自己补齐)

class BookView(APIView):
    def get(self,request):
        search=request.query_params.get('search')
        books=Book.objects.filter()

4.1 内置过滤类的使用【继承GenericAPIView】

class BookView(ViewSetMixin, ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    #  SearchFilter内置的,固定用法,模糊匹配
    #  就有过滤功能了,指定按哪个字段过滤
    filter_backends = [SearchFilter]
    # search_fields = ['name']  # 可以按名字模糊匹配
    search_fields = ['name','price']  # 可以按名字模糊匹配或价格模糊匹配
    
 # 可以使用的搜索方式
	http://127.0.0.1:8000/api/v1/books/?search=红  # name或price中只要有红就会搜出来
            
            
# 继承APIView如何写,完全自己写,麻烦,但是清晰     

4.2 使用第三方djagno-filter实现过滤

# 安装:django-filter
class BookView(ViewSetMixin, ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    permission_classes = []
    authentication_classes = []
    throttle_classes = []
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['name','price']  # 支持完整匹配  name=聊斋11&price=933
    
    
 # 支持的查询方式
http://127.0.0.1:8000/api/v1/books/?price=939
http://127.0.0.1:8000/api/v1/books/?price=939&name=红楼猛

4.3 自己定制过滤类实现过滤

# 查询价格大于100的所有图书
	http://127.0.0.1:8000/api/v1/books/?price_gt=100
            
            
            
 #第一步; 定义一个过滤类,继承BaseFilterBackend,重写filter_queryset方法
class CommonFilter(BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        # 在里面实现过滤,返回qs对象,就是过滤后的数据
        price_gt = request.query_params.get('price_gt', None)
        if price_gt:
            qs = queryset.filter(price__gt=int(price_gt))
            return qs

        else:
            return queryset
        
 # 第二步:配置在视图类上
class BookView(ViewSetMixin, ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    filter_backends = [CommonFilter]  # 可以定制多个,从左往右,依次执行

4.4 排序的使用

# 内置的就够了
class BookView(ViewSetMixin, ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [OrderingFilter]  
    ordering_fields = ['price']
    
 # 支持的查询方法:
    http://127.0.0.1:8000/api/v1/books/?ordering=price
    http://127.0.0.1:8000/api/v1/books/?ordering=-price
   http://127.0.0.1:8000/api/v1/books/?ordering=-id,price

5 分页

#  分页,只有查询所有接口,才有分页

# drf内置了三个分页器,对应三种分页方式

#内置的分页类不能直接使用,需要继承,定制一些参数后才能使用



# 分页使用,自定义一个分页类(三种)
class CommonPageNumberPagination(PageNumberPagination):
    page_size = 2  # 每页显示2条
    page_query_param = 'page'  # page=10  查询第10页的数据,每页显示2条
    page_size_query_param = 'size'  # page=10&size=5    查询第10页,每页显示5条
    max_page_size = 5  # 每页最大显示10条


# LimitOffset
class CommonLimitOffsetPagination(LimitOffsetPagination):
    default_limit = 3  # 每页显示2条
    limit_query_param = 'limit'  # limit=3   取3条
    offset_query_param = 'offset'  # offset=1  从第一个位置开始,取limit条
    max_limit = 5
    # offset=3&limit=2      0  1 2 3 4 5


# app 用下面

class CommonCursorPagination(CursorPagination):
    cursor_query_param = 'cursor'  # 查询参数
    page_size = 2  # 每页多少条
    ordering = 'id'  # 排序字段
# 配置在视图类上即可
class BookView(ViewSetMixin, ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    permission_classes = []
    authentication_classes = []
    throttle_classes = []
    # 之前的东西一样用 ,内置的分页类不能直接使用,需要继承,定制一些参数后才能使用
    # pagination_class = PageNumberPagination
    #基本分页方式(基本是这种,网页端):http://127.0.0.1:8000/api/v1/books/?page=2&size=3

    # pagination_class = LimitOffsetPagination
    # 偏移分页 http://127.0.0.1:8000/api/v1/books/?limit=4&offset=1
    # 从第一条开始,取4条

    pagination_class = CommonCursorPagination
    # 游标分页,只能下一页,上一页,不能跳到中间,但它的效率最高,大数据量分页,使用这种较好

作业

# 编写认证类,权限类,频率类,登录接口
	-所有接口,一分钟访问10次
    -查询所有图书和查询单条图书不登录可以访问
    -新增,删除,修改必须登录后才能访问
    -删除功能只有超级管理员能删除
    
# 三种过滤方式实现能够搜索图书,带排序




-------------------------------------------
# 高级---部分同学做
	-继承BaseThrottle,重写allow_request,实现按ip,一分钟只能访问3次
    #(1)取出访问者ip
    #(2)判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问,在字典里,继续往下走
    #(3)循环判断当前ip的列表,有值,并且当前时间减去列表的最后一个时间大于60s,把这种数据pop掉,这样列表中只有60s以内的访问时间,
    #(4)判断,当列表小于3,说明一分钟以内访问不足三次,把当前时间插入到列表第一个位置,返回True,顺利通过
    #(5)当大于等于3,说明一分钟内访问超过三次,返回False验证失败
    
    
# 基于APIView写分页

标签:排序,登录,ViewSetMixin,视图,token,接口,组件,权限,class
From: https://www.cnblogs.com/yong-wu/p/17098404.html

相关文章

  • 图表控件LightningChart.NET 系列教程(八):LightningChart 组件——从工具箱添加至 Windo
    LightningChar​t.NET​ SDK是一款高性能数据可视化插件工具,由数据可视化软件组件和工具类组成,可支持基于Windows 的用户界面框架(WindowsPresentationFoundation)、Win......
  • 选择排序
    选择排序算法原理:  首先在未排序序列中假设第一个元素为最小或者最大元素,然后再从剩余的元素中选择最小的(或者最大的)元素,然后放到已排序的头部或者尾部。以此类推,直到......
  • 拓扑排序 信息奥赛一本通 1352:【例4-13】奖金
    1352:【例4-13】奖金时间限制:1000ms      内存限制:65536KB提交数:607   通过数:223 【题目描述】由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Y......
  • [C++]数据结构之堆-上滤下滤以及用于排序
    #include<iostream>usingnamespacestd;/**堆,就是一棵完全二叉树,物理存储方式是数组,一般情况下,都牺牲第一个元素arr[0],剩下的就满足了从1开始计数*若堆从1开始计数,那么......
  • 51NOD 1278 相离的圆(二分 + 排序 好题)
    平面上有N个圆,他们的圆心都在X轴上,给出所有圆的圆心和半径,求有多少对圆是相离的。例如:4个圆分别位于1,2,3,4的位置,半径分别为1,1,2,1,那么{1,2},{1,3}{2,3}{2,4......
  • 51nod 2484 小b和排序(DP)
    小b有两个长度都为n的序列A,B。现在她需要选择一些i,然后交换A[i]和B[i],使得A和B都变成严格递增的序列。你能帮小b求出最少交换次数吗?输入保证有解。 收起输入第一行输入一......
  • 尚硅谷_组件说明
    导言好,接着呢我们去进行第三部分的讲解,也就是我们的组件说明,那整个k8s的框架还是非常庞大的,对吧?那我们要对它有一个非常高的了解以后,我们再去安装我们的k8s才会有一个比较......
  • 一个广告轮播组件 BGABanner-Android
    [img]http://dl2.iteye.com/upload/attachment/0118/4969/35eb64de-a738-3bdb-91d1-6770162d2795.gif[/img][img]http://dl2.iteye.com/upload/attac......
  • 抖音视频无水印下载器,抖音视频下载器,下载未开放下载权限的视频,支持批量下载,同一作者作
    抖音视频无水印下载,无下载权限的视频也能下,支持合集下载、批量下载!有些时候我们看到好看小姐姐的抖音作品,或者一些有价值的科普视频等,都希望将作品保存到本地,当一些作品的......
  • 堆排序
    leetcode-FindKthLargestpublicclassKthLargest{publicstaticvoidmain(String[]args){System.out.println(findKthLargest(newint[]{3,2,1,5,6,4}......