drf从入门到精通 09

今日内容详细

1.接口文档

# 前后端分离
	-我们做后端 写接口
	-前端做前端 根据接口写app pc 小程序
    
	-作为后端来讲 我们很清楚 比如登录接口/api/v1/login/  --->post --->username,password编码方式json ---> 返回的格式 {code:100,msg:登录成功}
    
	-后端人员 接口写完 一定要写接口文档
    
# 接口文档如何编写
	-1 使用word md 编写接口文档
	-2 使用第三方平台,编写我们的接口文档(非常多)---> 收费
		-https://www.showdoc.com.cn/item/index
	-3 公司自己使用第三方开源的搭建的---> Yapi ---> 你如果想自己搭建
		-https://zhuanlan.zhihu.com/p/366025001 
            
	-4 使用drf编写的接口 可以自动生成接口文档
		-swagger ---> drf-yasg ---> 官方推荐使用
		-coreapi
        
# 使用coreapi自动生成接口文档步骤
	-1 安装
	-2 配置路由
		from rest_framework.documentation import include_docs_urls
		path('docs/', include_docs_urls(title='xx项目接口文档')),
	-3 在视图类 方法上 写注释即可
		-在类上加注释
		-在类的方法上加注释
		-在序列化类或表模型的字段上加 help_text,required。。。
	-4 配置文件配置
		REST_FRAMEWORK = {
     		'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
    	}
	-5 访问地址
		http://127.0.0.1:8000/docs
                
# 接口文档 需要有的东西
	-描述
	-地址
	-请求方式
	-请求编码格式
	-请求数据详解(必填 类型)
	-返回格式
	-返回数据字段解释
	-错误码

2.jwt介绍和原理

# cookie session token 发展史

# Json web token (JWT) 就是web方向token的使用

#JWT的构成 三部分 每部分用 . 分割
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

	-头:header
		声明类型 这里是jwt
		声明加密的算法 通常直接使用 HMAC SHA256
        
	-荷载:payload
		载荷就是存放有效信息的地方 这些有效信息包含三个部分
            -标准中注册的声明
            -公共的声明
            -私有的声明
        标准中注册的声明(建议但不强制使用):
			iss: jwt签发者
			sub: jwt所面向的用户
			aud: 接收jwt的一方
			exp: jwt的过期时间,这个过期时间必须要大于签发时间
			nbf: 定义在什么时间之前,该jwt都是不可用的.
			iat: jwt的签发时间
			jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避时序攻击。
		公共的声明 : 公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.

		私有的声明 : 私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。
	-签名
		由三部分组成:
			header (base64后的)+payload (base64后的)+secret
这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。
注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。
# jwt开发重点
	-登录接口---> 签发token
	-认证类--->  jwt认证
    
# base64编码和解码

import base64
import json
dic={'user_id':1,'username':'lqz'}
dic_str=json.dumps(dic)
# 把这个json字符串使用base64编码
res=base64.b64encode(dic_str.encode('utf-8'))
print(res)

# 注意:base64编码后 字符长度一定是4的倍数 如果不是 使用 = 补齐   = 不表示数据
# 解码
res=base64.b64decode('TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ=')

# base64 应用场景
"""
1 jwt 使用了base64
2 网络中传输数据 也会经常使用 base64编码
3 网络传输中 有的图片使用base64编码
"""
s='二维码图片的编码'
res=base64.b64decode(s)
with open('a.png','wb') as f:
	f.write(res)

image

3.drf-jwt快速使用

# django+drf 平台开发jwt这套 有两个模块
	-djangorestframework-jwt   ---> 一直可以用
	-djangorestframework-simplejwt  ---> 公司用的多
	-自己封装jwt签发和认证
  
# djangorestframework-jwt使用步骤
	-1 安装
	-2 快速签发token ---> 登录接口 路由中配置
		from rest_framework_jwt.views import obtain_jwt_token
		path('login/', obtain_jwt_token),
	-3 postman 向http://127.0.0.1:8000/login/发送post请求,携带username和password

4.定制返回格式

# 以后 如果是基于auth的User表签发token 就可以不自己写了 但是登录接口返回的格式 只有token 不符合公司规范

# 使用步骤
	-1 新建utils.py 写个函数:jwt_response_payload_handler
		def jwt_response_payload_handler(token, user=None, request=None):
			return {
				'code': 100,
				'msg': '登录成功',
				'token': token,
				'username': user.username
				}
	-2 项目配置文件添加一下
		JWT_AUTH = {
    	'JWT_RESPONSE_PAYLOAD_HANDLER': 'app01.utils.jwt_response_payload_handler',  
	}
	-3 使用postman测试 查看返回的格式

5.jwt的认证类

# 以后接口要登录后才能访问使用

	-1 在视图类上加一个认证类 一个权限类
	from rest_framework_jwt.authentication import JSONWebTokenAuthentication
	from rest_framework.permissions import IsAuthenticated
	class BookView(ViewSetMixin, RetrieveAPIView):
		authentication_classes = [JSONWebTokenAuthentication]
		permission_classes = [IsAuthenticated] 
# 登录用户有权限 不登陆用户没权限
	-2 postman测试
		-请求头中key值叫Authorization
		-请求头的value值是:jwt 有效的token值
posted @   小白峰  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
点击右上角即可分享
微信分享提示