上节回顾
1 三大认证源码分析
-认证源码:
-APIView的dispatch----》initial---》perform_authentication---》request.user-->Request类中找user方法---》Request的 _authenticate()
2 全局异常处理
-统一返回格式
-记录日志
-使用步骤
-写一个函数,有两个参数
-只要出异常,就会走这个函数
-执行了一下原理的异常处理,处理了drf的异常(捕获了APIExcepiton的错误)
-drf处理不了的我们自己处理了
-返回Response对象
-在配置文件中配置
3 接口文档
-接口文档平台
-第三方平台(自己搭,直接花钱使用第三方)
-md,word写
-自动生成
-swagger,coreapi
-联调
今日内容
1 过滤,分页源码分析(**
)
1.1 过滤源码
1 查询所有才涉及到过滤(视图类必须继承:ListModelMixin+GenericAPIView)
2 在视图类中配置:filter_backends=[过滤类]
3 执行过滤类中的:filter_queryset方法,在方法中完成过滤,排序
4 查询所有----》执行的是-->get--->list(ListModelMixin)
5 ListModelMixin----->list方法
-queryset = self.filter_queryset(self.get_queryset())# 执行过滤
6 视图类的GenericAPIView的:self.filter_queryset
-def filter_queryset(self, queryset):
for backend in list(self.filter_backends):
queryset = backend().filter_queryset(self.request, queryset, self)
return queryset
7 自定义的过滤类,重写filter_queryset方法完成过滤---》配置在视图类中,就可以执行
1.2 分页源码
1 查询所有才涉及到分页(视图类必须继承:ListModelMixin+GenericAPIView)
2 在视图类中配置:pagination_class = 分页类
2 查询所有----》执行的是-->get--->list(ListModelMixin)
4 ListModelMixin----->list方法
page = self.paginate_queryset(queryset) # 执行分页
if page is not None: # 如果使用了分页
serializer = self.get_serializer(page, many=True)#只序列化当前分页的数据
return self.get_paginated_response(serializer.data)# 上一页和下一页和总条数
5 视图类GenericAPIView中:self.paginate_queryset(queryset)
# self.paginator是在视图类中配置的分页类的对象
# 实现了分页功能,取出从前端地址中传入的,第几页,取多少条
# 在该方法中自动实现分页,返回当前页码的数据
-return self.paginator.paginate_queryset(queryset, self.request, view=self)
6 视图类GenericAPIView中:get_paginated_response(serializer.data)
# self.paginator是在视图类中配置的分页类的对象
-self.paginator.get_paginated_response(data)
# 继承APIView,实现分页
class BookView(APIView):
def get(self, request):
# page = 5
# count = 3
qs = Book.objects.all()
# 分页,通过分页类分页
page = MyPageNumberPagination() # 实例化得到分页类对象,不需要传参数
# 对qs进行分页,分页类对象page的某个方法,来实现对qs分页
# 返回的res是列表,是当前页码的所有数据
res = page.paginate_queryset(qs, request, self)
# 对当前页码的数据,进行序列化
ser = BookSerializer(instance=res, many=True)
# return Response(ser.data)
return page.get_paginated_response(ser.data)
2 JWT介绍(****
)
# https://www.cnblogs.com/liuqingzheng/articles/8990027.html
# Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密
# JWT的构成
-三段式:
-header:一般放公司信息,加密方式 (用处不大)
-payload:用户信息: user_id,user_name,email,expire
-signature:第一部分和第二部加密得到的
-通过base64转码
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
3 jwt快速使用(**
)
# 使用第三方模块:django-rest-framework-jwt(作者好多年不改了)
# 新的,用起来,跟它差不多(名字忘了)
# 安装:pip install djangorestframework-jwt
# base64的使用(转码方式)
# 快速使用,签发token给前端
-用户表使用auth的user表
-登录功能不用写,djangorestframework-jwt帮你写好了
4 jwt内置认证类使用(**
)
4.1 签发(直接使用内置的)
# 在路由中配置
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
path('login/', obtain_jwt_token), # 登录接口好了,可以签发token,依赖了auth的user表
]
4.2 认证
from rest_framework_jwt.authentication import JSONWebTokenAuthentication # drf_jwt内置的认证类
from rest_framework.permissions import IsAuthenticated
class BookView(APIView):
# 使用drf_jwt内置的认证,必须加这两个
authentication_classes = [JSONWebTokenAuthentication, ]
permission_classes = [IsAuthenticated]
作业
1 基于APIViwe实现book的分页,偏移分页
2 使用jwt的快速签发和认证(登录后才能访问)
3 部分人:读obtain_jwt_token的源码
4 部分人:JSONWebTokenAuthentication源码