接口文档
1 作为后端,接口写完了---》接口给前端使用
-登录接口:username,password ,code
2 写接口的人负责写接口文档
-如何写?
-写在哪?
3 通常公司中会有放接口文档的平台:
1 使用world编写,放在公共平台上
2 使用MD编写
3 第三方平台编写:showdoc
4 自己开发:大公司
5 基于开源的 使用:YAPI 百度开源
-https://zhuanlan.zhihu.com/p/366025001
6 自动生成接口文档
4 自动生成接口文档步骤
-drf--》借助于第三方生成
-corapi
-drf-yasg
-drf-spectacular
-fastapi--》自带接口文档
5 coreapi如何使用
1 安装:pip3 install coreapi
2 在路由中注册
from rest_framework.documentation import include_docs_urls
urlpatterns = [
path('docs/', include_docs_urls(title='智慧社区项目')),
]
3 在视图类中写 视图类
-使用注释
---》写在类上的注释
---》写在方法内的注释
4 在序列化类中控制字段
-required
-help_text
5 配置文件配置
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
6 访问路径
http://127.0.0.1:8000/docs
jwt介绍
# 1 作用是 不使用session机制,来存储记录用户登录信息
# 2 jwt=Json Web Token:Json web token (JWT):常被用于认证,它是一个前端登录认证的方案,jwt就是token的一种
-session和cookie方案
# 3 cookie,session,token发展史
https://www.cnblogs.com/liuqingzheng/articles/17858187.html
# 4 token认证机制
1 签发阶段:登录接口,登录成功,就签发
-token有 三部分,每部分用 . 分割 ,组装成一个字符串,每部分都用base64编码
头部:公司信息,加密方式等
荷载:真正数据部分,用户id,用户名字,过期时间,签发时间。。
签名:头部+荷载--》使用某种加密方式加密---》得到一个字符串
-直接返回给前端,不在后端存储
-前端拿到后,web:存到cookie中,小程序:存到小程序存储中 app:app存储中
2 认证阶段:需要登录后方的接口,要校验token是否合法
-前端携带 token在请求头中到后端,后端接收到后进行校验
-把头部和荷载使用同样的加密方式加密--》得到一个字符串 和第三部分比较是否一样
-如果一样,说明就是当前我们签发的,没有被别人篡改过--》校验通过
-取出用户id--》就能知道是哪个用户访问了
-如果不一样,说明就不是当前我们签发的,被别人篡改过--》校验不通过
# 5 一个典型的token,长这样
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. # 头
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.# 荷载
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ # 签名
base64编码和解码
import base64
import json
# 编码
user_dic={'name':'lqz','age':19,'user_id':99}
# 转成json格式字符串
user_str=json.dumps(user_dic)
# 使用base64编码
res=base64.b64encode(user_str.encode('utf-8'))
print(res) # eyJuYW1lIjogImxxeiIsICJhZ2UiOiAxOSwgInVzZXJfaWQiOiA5OX0=
# 解码
# res1=base64.b64decode('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9=') # b'{"alg":"HS256","typ":"JWT"}'
# res1=base64.b64decode('eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9') # {"sub":"1234567890","name":"John Doe","admin":true}'
res1=base64.b64decode('TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ=') # 签名
print(res1)
# 1 base64的长度一定是 4 的倍数,如果不足,要用 = 补齐, = 不表示数据,只是占位
# 2 base64的作用
# 1 jwt 使用base64编码
#2 数据在互联网中传输,会使用base64编码后传输
#3 图片的二进制--》转成base64在互联网中传输
s='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'
res=base64.b64decode(s)
print(res)
with open('a.jpg','wb') as f:
f.write(res)