上节回顾
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)
-return self.paginator.paginate_queryset(queryset, self.request, view=self)
6 视图类GenericAPIView中:get_paginated_response(serializer.data)
-self.paginator.get_paginated_response(data)
class BookView(APIView):
def get(self, request):
qs = Book.objects.all()
page = MyPageNumberPagination()
res = page.paginate_queryset(qs, request, self)
ser = BookSerializer(instance=res, many=True)
return page.get_paginated_response(ser.data)
2 JWT介绍(****
)
-三段式:
-header:一般放公司信息,加密方式 (用处不大)
-payload:用户信息: user_id,user_name,email,expire
-signature:第一部分和第二部加密得到的
-通过base64转码
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
3 jwt快速使用(**
)
-用户表使用auth的user表
-登录功能不用写,djangorestframework-jwt帮你写好了
4 jwt内置认证类使用(**
)
4.1 签发(直接使用内置的)
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
path('login/', obtain_jwt_token),
]
4.2 认证
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework.permissions import IsAuthenticated
class BookView(APIView):
authentication_classes = [JSONWebTokenAuthentication, ]
permission_classes = [IsAuthenticated]