过滤和分页源码、接口文档、jwt介绍和构成、base64编码、drf-jwt使用

news2025/2/27 8:19:07

过滤和分页源码

补充

#### 为什么在视图类中配置一个过滤类,就能走
	-filter_backends = [SearchFilter,MyFilter]
    -GenericAPIView:继承APIVIew的视图类,是不能这样配置的----》自己过滤
    	-filter_backends = api_settings.DEFAULT_FILTER_BACKENDS
	-还需要继承:ListModelMixin---》它的list方法中,在对所有数据做过滤:queryset = self.filter_queryset(self.get_queryset())
    
    -self.filter_queryset如何做的过滤呢?ListModelMixin类中没有这个方法,最终从GenericAPIView中找到了
    
    -GenericAPIView的filter_queryset干了啥事?
        def filter_queryset(self, queryset):
            # 过滤类
            for backend in list(self.filter_backends):  # filter_backends视图类中配置的过滤类,列表		# 过滤类加括号---》  过滤类的对象---》调用过滤类对象的filter_queryset
                queryset = backend().filter_queryset(self.request, queryset, self)
            return queryset
    	
# 继承APIView---》写过滤---》可以复制GenericAPIView一些方法和属性,让我们少写代码



####  视图类中配置了分页类,为什么就有分页了?
	- pagination_class = CommonCursorPagination  # GenericAPIView类属性
    -pagination_class是GenericAPIView的类属性:继承APIVIew的视图类,是不能这样配置的----》自己分页
    -还需要继承:ListModelMixin---》它的list方法中,在对所有数据做了分页--def list(self, request, *args, **kwargs):
        # 做过滤
        queryset = self.filter_queryset(self.get_queryset())
		#### 分页开始
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
		#### 分页结束### 
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)
    
    -self.paginate_queryset(queryset)是  GenericAPIView  类的方法
    
    
    - GenericAPIView的   paginate_queryset
    def paginate_queryset(self, queryset):
        if self.paginator is None:
            return None # 不做分页了
        # 做分页
        return self.paginator.paginate_queryset(queryset, self.request, view=self)
    
    -self.paginator 方法包装成了属性,就是咱们分页类的对象  CommonCursorPagination()
    @property
    def paginator(self):
        self._paginator = self.pagination_class() # 咱们配置的分页类  CommonCursorPagination
        return self._paginator
    
    - 调用了 分页类对象的paginate_queryset---》完成真正的分页
    	分页类对象.paginate_queryset(queryset, self.request, view=self)
        
        
        
# 之前是先执行了res = exception_handler(exc, context),现在要自己做,处理drf异常



# 为什么在配置文件中配置了自己写的全局异常处理函数,只要出了异常,它就会走?
	-APIView执行流程---》dispatch的 
       try:
        except Exception as exc:
            response = self.handle_exception(exc) #看这里,exc是错误对象
            
    -执行:self.handle_exception(exc)---》self是视图类的对象
    -APIView的handle_exception(exc)
    -handle_exception源码
    
        def handle_exception(self, exc):
            exception_handler = self.get_exception_handler() # 猜 拿到的就是配置文件中配的那个函数
            response = exception_handler(exc, context) #执行这个函数,传了俩参数
            return response
        
     -self.get_exception_handler()是如何从配置文件中拿出来的
    	-self.settings.EXCEPTION_HANDLER  # 先从项目配置文件中找:key为它的EXCEPTION_HANDLER,如果项目配置文件没有,拿drf内置的配置文件
        
        
        
        
# 如果你写了全局异常处理函数,配置好了,但是前端还没有返回固定格式,可能的原因是什么?
	-1 这个错误不是在三大认证和视图类的方法中产生的,之前产生的--》中间件,包装新的request
    -2 你写的common_exception执行出错了

1 接口文档

# 作为后端,接口写好了
# 作为前端,需要使用我们写的接口(移动端,web,桌面端)

# 后端需要写接口文档


# 接口文档的展现形式:
	1 word ,md ,写好传到公司的某个平台---》前端可以下载
    2 自动生成接口文档---》后端通过配置--》把所写的接口都自动生成---》地址--》访问这个地址就能看到所有接口文档
    
    3 公司内部搭建接口文档平台
    	- 开源:Yapi--->同学搭建一个,给搭建用
            -https://zhuanlan.zhihu.com/p/366025001
        - 自己开发(自研)
        
    4 使用第三方平台(花钱)-->showdoc ....

# 接口文档如何写?需要有哪些东西?
	-以用户注册接口为例:
    	1 接口描述
        2 请求地址
        3 请求方式
        4 编码格式:json,urlencoded,form-data
        5 请求参数:参数详解
        	-请求地址参数
            -请求体参数
		6 返回格式示例--》返回参数说明
        7 备注(可有可无)--》错误码
        
        
        
        
# 自动生成接口文档
	-coreapi,swagger:drf-yasg
    
    
    
# coreapi自动生成
第一步:pip install coreapi
第二步:设置接口文档访问路径
from rest_framework.documentation import include_docs_urls
urlpatterns = [
    ...
    path('docs/', include_docs_urls(title='站点页面标题'))
]

第三步:在视图中,加注释

第四步:配置文件配置
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2 jwt介绍和构成

# 做会话保持的发展历史
	-https://www.cnblogs.com/liuqingzheng/p/8990027.html

# jwt:Json Web Token:web方向的token认证方案
# 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证(token串)。我们不再使用Session认证机制,而使用Json Web Token(本质就是token)认证机制

# Json web token (JWT), JWT用在咱们前后端做登录认证的,如果登录了,就携带token过来,如果没登录,就不携带---》后端通过验证token的准确性,确定是谁访问我们


#JWT的构成--三部分
	eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
    
    # 头:header
    	-一般放公司信息,加密方式(没放秘钥)
    # 荷载:payload
    	-当前用户的信息:用户名,用户id,token过期时间。。。
    # 签名:signature
    	-第一部分和第二部分通过加密得到的字符串

3 jwt签发与认证

# 以后使用jwt,最核心的就是写两个地方
	-签发:(登录接口)
    	-登录接口,登录成功,签发token(三段式)
        -header,用base64编码,暂放
            {"company": "公司信息",}
        -payload,用base64编码,暂放
        	{用户名,用户权限,过期时间}
        -使用加密方式:md5,把header和payload 都update进md5中---》生成前面---》base64编码
        
        -三段拼接起来---》用 .  分割 
        
        
    -认证(认证类)
    	-用户携带token过来,认证
        -取出第一部分header
        -取出第二部分 payload
        -使用之前同样的加密算法(密码),得到新前面
        -跟token的第三部分比较,如果一样,表示没有被窜改,顺利继续往下走,返回两个值
        -如果被篡改了,抛异常

4 base64编码

# base64 编码

# 作用,用途:
	1 token串使用base64编码
    2 互联网中前后端数据交互,可以使用base64编码
    3 图片二进制可以使用base64编码传递
    
    

import json
import base64
img='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'



# base64 的编码和解码(字符串)
###编码
# d={'name':'lqz','age':19}
# d_str=json.dumps(d)
# res=base64.b64encode(d_str.encode('utf-8'))  # 字符串转bytes格式
# print(res)  # eyJuYW1lIjogImxxeiIsICJhZ2UiOiAxOX0=
# base64编码字符串长度必须是4的倍数,如果不足,用= 补齐,= 一定不会超过3个
# 解码
# res=base64.b64decode('eyJuYW1lIjogImxxeiIsICJhZ2UiOiAxOX0=')
# print(res)



##把图片保存到本地
res=base64.b64decode(img)
with open('xx.png','wb') as f:
    f.write(res)

5 drf-jwt使用

# django 中使用jwt

# 可以自己写,使用第三方
	-django-rest-framework-jwt:有点老
    -djangorestframework-simplejwt:新的
    -自己写:https://gitee.com/liuqingzheng/rbac_manager/blob/master/libs/lqz_jwt/token.py
    
# 下载:
pip install djangorestframework-jwt
	


5.1 django-rest-framework-jwt快速使用

# 签发:默认使用auth的user表签发--》登录接口--人家帮咱们写了
    from rest_framework_jwt.views import obtain_jwt_token # 这就是个登录接口,人家帮你写好了
    urlpatterns = [
        path('login/', obtain_jwt_token),
    ]
    
# 认证--》认证类
	-视图类上,配置认证类和权限类
    	authentication_classes = [JSONWebTokenAuthentication,]
    	permission_classes = [IsAuthenticated]
	
    

5.3 定制签发返回格式

# 自定义认证返回结果

# 写个函数
def jwt_response_payload_handler(token, user=None, request=None):
    return {
        'status': 100,
        'msg': '登录成功',
        'token': token,
        'username': user.username
    }

# 配置文件配置
JWT_AUTH = {
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'app01.response.jwt_response_payload_handler',
}

5.4 obtain_jwt_token源码分析

#为什么 路由这样配了,就会有个登录接口
 	path('login/', obtain_jwt_token),
    
#obtain_jwt_token 本质是ObtainJSONWebToken.as_view()

# 本质是ObtainJSONWebToken
class ObtainJSONWebToken(JSONWebTokenAPIView):
    serializer_class = JSONWebTokenSerializer
    
# 向login发送post请求,ObtainJSONWebToken一定有个post方法

# 在父类中:JSONWebTokenAPIView  post
	-登录走的是JSONWebTokenAPIView的post,签发token 是在序列化类中
    -签发完token执行了,咱们写的jwt_response_payload_handler,所以才能定制返回格式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/990481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TVjar生成踩坑记录

近期TVBox及其衍生品很火,其中,jar更是主力军 github上有相关源码。 因为github总是被墙,想着能不能自己生成呢 于是开始折腾。 1、下载仓库 以这个为例 仓库下载地址 2、尝试在电脑生成jar 直接运行 buildAndGenJar.bat 3、报错 各…

使用Spring Gateway为对象存储系统MinIo和kkFileView文档预览增加登录验证

文章目录 1、kkfileview下载部署1.1、安装包部署运行1.1.1、物理机或虚拟机上运行1.1.2、Docker容器环境环境运行 1.2、接入说明 2、使用Spring Gateway增加登录认证2.1、网关实现代码2.2、文件服务实现代码2.3、Demo运行效果 官网介绍:kkFileView为文件文档在线预览…

浅谈安科瑞智能操控装置在上海特斯拉工厂配电工程的应用

0.背景 Background 2018年10月17日,上海市临港管委会表示,特斯拉(上海)有限公司已成功摘得上海临港装备产业区Q01-05地块864885平方米(合计1297.32亩)的工业用地。2019年1月7日,位于上海东南一…

C动态分配

动态分布与静态发布: 静态分配 1、 在程序编译或运行过程中,按事先规定大小分配内存空间的分配方式。int a [10] 2、 必须事先知道所需空间的大小。 3、 分配在栈区或全局变量区,一般以数组的形式。 4、 按计划分配。 动态分配 1、在程序运…

Alins - 化繁为简、极致优雅的WebUI框架

最近造了个js框架 Alins,分享一下: 🚀 Alins: 最纯粹优雅的WebUI框架 English | 文档 | 演练场 | 更新日志 | 反馈错误/缺漏 | Gitee | 留言板 0 简介 0.1 前言 Alins是一款极致纯粹、简洁、优雅的Web UI框架。秉持0-API、Less is More 的…

替换滚珠螺杆需要了解哪些参数?

滚珠螺杆具有定位精度高、高寿命、低污染和可做高速正逆向的传动及变换传动等特性,因具上述特性,滚珠螺杆已成为近来精密科技产业及精密机械产业的定位及测量系统上的重要零组件之一。 众所周知,滚珠螺杆是可以替换的,不仅同品牌之…

概率论与数理统计学习笔记(7)——全概率公式与贝叶斯公式

目录 1. 背景2. 全概率公式3. 贝叶斯公式 1. 背景 下图是本文的背景内容,小B休闲时间有80%的概率玩手机游戏,有20%的概率玩电脑游戏。这两个游戏都有抽卡环节,其中手游抽到金卡的概率为5%,端游抽到金卡的概率为15%。已知小B这天抽…

步进电机基本结构原理了解一下

工作原理 步进电机驱动器根据外来的控制脉冲和方向信号, 通过其内部的逻辑电路,控制步进电机的绕组以一定的时序正向或反向通电,使得电机正向/反向旋转,或者锁定。 以1.8度两相步进电机为例:当两相绕组都通电励磁时&…

喜马拉雅 Redis 与 Pika 缓存使用军规

作者:喜马拉雅 董道光 宣言:缓存不是万金油,更不是垃圾桶!!! 缓存作为喜马拉雅至关重要的基础组件之一,每天承载着巨大的业务请求量。一旦缓存出现故障,对业务的影响将非常严重。因…

经销商沟通难题怎么破?破解之道看这里!

01 经销商:生产商的得力帮手,消费者的贴心管家 经销商是指在市场经济中,负责将生产商生产的产品或提供的服务转售给最终消费者的中间商。在现代商业环境中,经销商在产品分销链条中扮演着重要的角色,他们促进了产品的快…

Python 自然语言处理 文本分类 地铁方面留言文本

将关于地铁的留言文本进行自动分类。 不要着急,一步步来。 导入需要的库。 import numpy as np import pandas as pd import jieba # 分词 import re # 正则 from fnmatch import fnmatch # 通配符 from sklearn.preprocessing import LabelEncoder from sklearn…

数据分析面试题(2023.09.08)

数据分析流程 总体分为四层:需求层、数据层、分析层和结论层 一、统计学问题 1、贝叶斯公式复述并解释应用场景 公式:P(A|B) P(B|A)*P(A) / P(B)应用场景:如搜索query纠错,设A为正确的词,B为输入的词,那…

世和基因亮相2023服贸会,中国精准检测技术走向世界

9月6日,2023中国国际服务贸易交易会在北京圆满收官,本届服贸会围绕“开放引领发展,合作共赢未来”年度主题,吸引了全球领先的创新技术和科研成果亮相盛会,累计入场近28万人。 作为国内肿瘤精准医学头部企业&#xff0…

pdfjs在线预览组件的使用

前言 pdfjs在线预览组件。 原生浏览器预览pdf文件,存在pdf xss跨站攻击风险。推荐使用pdfjs第三方组件在线预览pdf文件。 如何使用 下载 官方插件下载地址:https://mozilla.github.io/pdf.js/getting_started/ 安装 把下载的文件复制到项目中 使用pd…

Docker详解,7分钟学会

大家好,欢迎来到停止重构的频道。 本期我们讨论docker。 docker的好处是可以隔离环境,多容器间环境隔离互不影响。 而且得益于优秀的镜像机制,可以用于手工快速部署。 我们按这样的顺序展开讨论: 1、 docker的工作原理 2、 …

jvm 程序计算器 程序计数器是否溢出 程序计数器是做什么的 java程序计数器会内存溢出吗 程序计数器作用与用处 jvm内存模型 jvm合集(一)

1. jvm内存模型: 内存模型: 程序计数器 堆 栈 本地方法栈 方法区 2. java代码编译为class文件,由类加载器加载到jvm,然后由解释器,jit即时编译到机器码,机器码再到cpu执行 3. 程序计数器: 是一块较小的内存…

Excel相关笔记

1、找出B列中A列没有的数据并放在C列 公式:IF(ISNA(VLOOKUP(B1,$A 1 : 1: 1:A$4,1,FALSE)),B1,“”)

索尼 toio™ 应用创意开发征文 | 如何用Python控制Q宝进行机器人擂台赛

你是否曾经想过,如果能用编程来控制真实的物体,那该有多有趣?如果能让一个小方块按照你的指令来移动、旋转、闪烁,那该有多酷?如果能让一个小方块和其他小方块互动,那该有多神奇?这些想法&#…

Jmeter系列-插件安装(5)

前言 jmeter4.0以上,如现在最新的5.2.1版本是有集成插件的只需要在官网下载 plugins-manager.jar 包,放在jmeter安装路径的lib/ext目录下即可使用:https://jmeter-plugins.org/install/Install/但并不能满足所有需求,仍然需要安装…