首页 > 其他分享 >drf

drf

时间:2023-02-07 20:34:44浏览次数:29  
标签:ViewSetMixin price token classes books class drf

今日内容

1.认证组件

2.权限组件

3.频率组件

4.过滤排序

5.分页

1.认证组件

认证组件使用步骤

1.写一个认证类,继承BaseAuthentication
2.重写authenticate方法,在该方法在中实现登录认证
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 = [] 

代码

视图
查询所有
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字段

权限的使用

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次

使用步骤

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个接口中,只有一个接口需要有过滤和排序,查询所有接口
    
查询 所有图书接口,查询以  红  开头的所有图书

内置过滤类的使用 继承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如何写,完全自己写,麻烦,但是清晰     

使用第三方django-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=红楼梦

自己定制过滤类实现过滤

查询价格大于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]  可以定制多个,从左往右,依次执行

排序的使用

内置的就够了
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
    游标分页,只能下一页,上一页,不能跳到中间,但它的效率最高,大数据量分页,使用这种较好

标签:ViewSetMixin,price,token,classes,books,class,drf
From: https://www.cnblogs.com/yueq43/p/17099710.html

相关文章

  • drf-day7——认证组件、权限组件、频率组件、过滤排序、分页
    目录一、认证组件1.1登录接口1.2认证组件使用步骤1.3整体代码二、权限组件2.1需求分析:2.2权限的使用2.3代码三、频率组件3.1使用步骤3.2代码四、过滤排序4.0继承API......
  • DRF - 认证
    目录认证组件1.登录接口编写2.认证功能自定认证的使用步骤3.全局认证与局部认证、局部禁用(1)局部认证:对于对应的视图类生效(2)全局认证:对于全局的视图类生效(3)全局认证+局部......
  • DRF - 权限
    目录权限组件1.自定权限的使用步骤2.全局使用与局部使用(1)局部权限:对单独的视图类生效(2)全局权限:对于全局的视图类生效(3)全局权限+局部禁用3.代码演示permission.py-定制......
  • drf-6
    9个视图子类#两个视图基类#5个视图扩展类#9个视图子类---->视图类,不需要额外继承GenericAPIView,只需要继承9个中其中某个,就会有某个或某几个接口#路由urlpatterns......
  • 【Django drf】视图层大总结 ViewSetMixin源码分析 路由系统 action装饰器
    目录九个视图子类视图集继承ModelViewSet类写五个接口继承ReadOnlyModelView编写2个只读接口ViewSetMixin源码分析查找as_view方法setattr修改对象的属性fromrest_framew......
  • drf视图组件,视图集,路由系统,认证组件
    上周回顾#1前端开发模式-分离和混合-http通信后端都是web后端-前端:pc桌面开发,web开发,app,小程序--->http--->调用后端--->后端都是一套#2api接口......
  • drf9个视图子类,2个视图集,路由系统,认证组件
    上周内容大回顾前后端开发模式前后端混合模式 1.前端写好交给后端用后端模板语法,把数据补上去2.前后端全栈,都有一个人写前后端分离 1.前端写前端,后端就只写接口......
  • drf之路由系统
    目录路由系统自动生成路由action装饰器补充知识路由系统drf由于继承ViewSetMixin类,路由写法就改变了路由的三种写法1.path('books/',views.BookView.as_view())2.path......
  • drf之认证组件
    目录认证组件登录接口认证功能认证组件访问某个接口,需要登录后才能访问编写模型表classUser(models.Model):username=models.CharField(max_length=32)pa......
  • drf-视图集、路由系统、action装饰器
    1.9个视图扩展类1.两个视图基类:APIView、GenricAPIView2.5个视图扩展类:CreateModelMixin,UpdateModelMixin,RetrieveModelMixin,ListModelMixin,DestroyModelMixin3.9......