首页 > 其他分享 >drf—过滤、分页、异常

drf—过滤、分页、异常

时间:2023-09-07 20:23:30浏览次数:28  
标签:分页 过滤 视图 django session 字符串 查询 drf

session回顾

写一个登录接口——保存用户登录状态

签发阶段:做了三件事情:

  1、生成一个随机字符串

  2、django—session表中插入数据

  3、把随机字符串以cookie形式返回给前端(存在浏览器的cookie中)

认证阶段:

  前端自动携带cookie到后端,sessionid:随机字符串

session的流程:

  前端写登录和密码后会将用户名和密码携带

  在视图函数中写一个登录接口,取出用户携带的用户名和密码,去数据库里查询,如果查得到就是已经登录,设置session,例如request.session[name],并且返回四件套。

  在中间件中自动完成的事情:1、生成一个随机字符串。2、把字符串和数据存到django-session 3、把随机字符串返回给浏览器

  浏览器将随机字符串存进了sessionid中。在需要登录才能访问接口,浏览器会自动把cookie携带访问的网址。

  中间件又做了三件事:1、取出随机字符串  2、通过随机字符串去django-session中查询 3、把data的数据以字典的形式放到request.session中

  下次就可以取出前面保存的数据

 自己写的登录接口本质原理也是session的认证机制,session是存储在服务端的键值对。

 

过滤

 只针对查询所有接口

必须继承GenericAPIView

需要安装模块

    pip install django==3.2.12
    pip install django-filter

使用方法:三种

方法一:内置的(模糊匹配,查询关键字search)

from rest_framework.filters import SearchFilter, OrderingFilter 查询方式http://127.0.0.1:8000/books/?search=29(模糊匹配,只要数据中有name或者price的都可以查询出)

    filter_backends = [SearchFilter, OrderingFilter]
    search_fields = ['name', 'price']

方法二:第三方的(精准匹配,按照筛选器中自己需要查询的进行查询即可)

from django_filters.rest_framework import DjangoFilterBackend http://127.0.0.1:8000/books/?name=红楼梦
 http://127.0.0.1:8000/books/?price=19&name=西游记
    filter_backends = [DjangoFilterBackend]
     filterset_fields=['name','price']   (筛选器字段)

方法三:自定义(由自己控制)

自定义过滤类中用Q来写“或”(“|”),但是url中还是用&来表示“或”

from rest_framework.filters import BaseFilterBackend filter_queryset(self, request, queryset, view)  (重写这个方法) 重写一个文件,导入模块

 

继承APIView写过滤和排序

回顾知识:过滤

order_by()  排序
# res = models.User.objects.order_by('age') # 默认升序
# res = models.User.objects.order_by('-age') # 降序
# print(res)

继承GenericAPIView写过滤类,可以写多个

 大原则:配置多个过滤类的时候,第一个放尽量多个过滤掉数据

配置多个:执行原理

  先执行第一个过滤类:filter_queryset返回qs对象

  再执行第二个过滤类的filter_queryset,传入上一个返回的qs,过滤完返回qs对象

 

分页

只针对查询所有的接口

分页展现形式:

  web:下一页,上一页

  小程序:app:上拉加载更多

必须继承 GenericAPIView 

 先写一个文件,导入模块

from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination

 PageNumberPagination分页类:

 视图类:

LimitOffsetPagination分页类:

 视图类:

 CursorPagination分页类:

视图类:

 继承GenericAPIView的视图类

from .page import CommonPageNumberPagination,CommonLimitOffsetPagination,CommonCursorPagination
class BookView(ViewSetMixin, ListAPIView):
    authentication_classes=[]
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    pagination_class =CommonCursorPagination   # 分页方式只有一种,配置一个类即可

继承APIView也要实现

class BookView(ViewSetMixin, APIView):
    authentication_classes=[]
    def list(self,request,*args,**kwargs):
        book_list=Book.objects.all()
        pagination =CommonPageNumberPagination()
        page=pagination.paginate_queryset(book_list,request)
        ser=BookSerializer(instance=page,many=True)
        return Response(ser.data)

异常处理

三大认证 视图类的方法中执行出错,都会被全局异常捕获

  认证类,认证不通过,抛异常,前端看到没有问题,只是返回了提示信息,处理了drf的异常

 drf全局异常处理,她会把drf的异常处理掉,统一返回格式,但是django原生的和python的都不会处理

无论什么异常都会返回固定格式

重写一个文件exception

视图类:

 异常类:

 

 

 

 

 

  

标签:分页,过滤,视图,django,session,字符串,查询,drf
From: https://www.cnblogs.com/YeeQX/p/17685954.html

相关文章

  • drf 分页类
    一、分页类型一1、写一个分页类,继承 PageNumberPaginationweb用这个多http://api.example.org/accounts/?page=4http://api.example.org/accounts/?page=4&page_size=100fromrest_framework.paginationimportPageNumberPagination,LimitOffsetPagination,CursorPagin......
  • drf-排序、过滤、分页、异常处理
    一、排序只有5个接口中的查询所有,才涉及到排序,所以继承GenericViewSet, 使用步骤:1.必须写在继承:GenericAPIView类的视图中才行2.配置类属性:filter_backends=[OrderingFilter]ordering_fields=['id','user_type']#可以排序的字段3.使用:......
  • 过滤,分页,异常处理
    1过滤只针对于查询所有接口必须继承GenericAPIView#安装: pipinstalldjango==3.2.12pipinstalldjango-filter#使用方式:三种 -方式一:内置的#查询方式http://127.0.0.1:8000/books/?search=29#模糊匹配:只要名字中有29或价格中有29都能搜......
  • pagehelper分页框架进行定时跑批分页 在插入与sql语句的编写,当插入有库中有报异常显示
    以下是一个示例的业务类,使用PageHelper分页框架进行定时跑批分页插入操作,并在遇到重复数据时跳过继续插入:importcom.github.pagehelper.PageHelper;importcom.github.pagehelper.PageInfo;importorg.springframework.beans.factory.annotation.Autowired;importorg.spring......
  • ABP-数据过滤器(Fliter)
    过滤器文档地址ABP预定义过滤器过滤器禁用对于默认启动的过滤器,可以使用using语句临时禁用,也可全局禁用using语句临时禁用软删除过滤using(CurrentUnitOfWork.DisableAuditing(AbpDataFilters.SoftDelete)){varlist=_approvaloperaterecordsRepository.GetAll();}us......
  • 内存隔离-分段-分页
    内存隔离程序是运行在内存中,不同程序之间需要做地址隔离,不然恶意程序会修改其他程序的数据,不好的程序会越界修改变量。因此,内存需要对进程进行隔离,让每个进程拥有独立的虚拟空间分段内存映射根据程序所需空间大小,在虚拟内存空间划分出一定的区域大小然后在实际物理内存中......
  • MySQL系列之主从复制进阶——延时从库、半同步、过滤复制、GTID复制
    目录1.延时从库1.1介绍1.2为什么要有延时从1.3配置延时从库1.4延时从库应用1.4.1故障恢复思路1.4.2故障模拟及恢复2.半同步***2.1半同步复制工作原理的变化2.2配置半同步复制3.过滤复制3.1说明4.GTID复制4.1GTID引入4.2GTID介绍4.3GTID核心参数4.4......
  • drf-认证、权限、频率
    一、认证组件1.认证组件的作用一些接口,想要限制登录之后才能访问,没登录不能访问做登录认证,限制如果没有登录,不允许访问该接口2.认证类的使用:1.在auth.py中写一个类,去继承BaseAuthentication2.在这个类中重写:authenticate方法3.在authenticate完成......
  • drf 认证、权限、频率三组件
    一、认证组件判断用户是否登录,数据库是否有值1、需求:通过认证组件去认证,没有认证通过的用户不让登录。认证方式前端发来的token值与数据库进行对比2、modelsfromdjango.dbimportmodelsclassUser(models.Model):username=models.CharField(max_length=32)......
  • drf-day8
    认证组件1、登录功能写登录的时候可以使用auth提供的user表,也可以自定义写接口登录成功时,需要有一个标志,所以需要随机生成一个随机字符串,放在表中,以后只要携带这个随机字符串过来,我们就认为用户登录。视图类fromrest_framework.viewsetsimportViewSetviewset继承fromre......