drf入门之自动生成接口、Drf-Jwt及认证类、定制返回格式
接口文档
# 前后端分离
-后端,写接口
-前端,根据接口写app,pc,小程序
-作为后端来讲,如登录接口:
/api/v1/login/——>post——>(username,password) 编码方式json——>返回的格式 {code:100,msg:登录成功}
-后端人员接口写完一定要写接口文档
# 编写接口文档
1、使用Word,md编写接口文档
2、使用第三方平台编写接口文档(收费)
如showdoc(https://www.showdoc.com.cn/item/index)
3、公司使用第三方开源搭建的(Yapi)。若想自己搭建,可查看下方教程:
https://zhuanlan.zhihu.com/p/366025001
4、使用drf编写的接口,可自动生成接口文档。
可以通过下载swagger和coreapi模块实现。
swagger——drf-yasg(官方推荐使用)
coreapi
# 接口文档需要有的东西
描述
地址
请求方式
请求编码格式
请求数据详解
返回格式案例
返回数据字段解释
错误码
使用coreapi自动生成接口文档步骤
# 使用coreapi自动生成接口文档步骤
1.安装coreapi库
Rest framework生成接口文档需要coreapi库的支持。
# pip install coreapi
2.设置接口文档访问路径
在总路由中添加接口文档路径,将文档路由对应的视图配置为
from rest_framework.documentation import include_docs_urls,参数title为接口文档网站的标题。
例:
from rest_framework.documentation import include_docs_urls
urlpatterns = [
...
path('docs/', include_docs_urls(title='站点页面标题'))
]
3、在视图类方法上,写注释
类上加注释
类的方法上加注释
序列化或表模型字段上加 help_text,required...
4、配置文件配置
REST_FRAMEWORK = {
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}
5、访问地址:
http://127.0.0.1:8000/docs
jwt介绍和原理
- 用户注册或登录后想记录用户登录状态或为用户创建身份认证的凭证,不再使用session认证机制而使用Json Web Token(本质是token)认证机制。
# JWT的构成
JWT就是一段字符串,由三段信息构成,将三段信息文本用。
链接一起就构成了Jwt字符串。如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).
# 头:header
声明类型,这里是jwt
声明加密的算法,通常直接使用 HMAC SHA256
{
'typ': 'JWT',
'alg': 'HS256'
}
# 荷载:payload,存放有效信息的地方
过期时间
签发时间
用户id
用户名字...
# 签名:signature
第一部分和第二部分通过秘钥+加密方式得到的
# jwt开发重点
-登录接口---->签发token
-认证类-----》jwt认证
# base64编码和解码
import base64
import json
# dic={'user_id':1,'username':"lqz"}
#
# dic_str=json.dumps(dic)
#
# #把这个字符串使用base64编码
# res=base64.b64encode(dic_str.encode('utf-8'))
# print(res)
# 注意:base64编码后,字符长度一定是4的倍数,如果不是,使用 = 补齐, = 不表示数据
# 解码
res=base64.b64decode('TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ=')
print(res)
# base64 应用场景
'''
1 jwt 使用了base64
2 网络中传输数据,也会经常使用 base64编码
3 网络传输中,有的图片使用base64编码
'''
s=''
res=base64.b64decode(s)
with open('a.png','wb') as f:
f.write(res)
drf-jwt快速使用
#django+drf 平台开发jwt这套,有两个模块
djangorestframework-jwt # 一直可以用
djangorestframework-simplejwt #公司里用的多
自己封装jwt签发和认证
# 使用步骤
1、安装
2、快速签发token---》登录接口,路由中配置
path('login/', obtain_jwt_token),
3、postman,向http://127.0.0.1:8000/login/发送post请求,携带username和password
定制返回格式
# 如果是基于auth的User表签发token,可以不自己写;但是登录接口返回的格式只有token,不符合公司规范
# 使用步骤
1、函数:jwt_response_payload_handler
def jwt_response_payload_handler(token, user=None, request=None):
return {
'code': 100,
'msg': '登录成功',
'token': token,
'username': user.username
# 'icon':user.icon
}
2、配置一下 ,项目配置文件
JWT_AUTH = {
'JWT_RESPONSE_PAYLOAD_HANDLER': 'app01.utils.jwt_response_payload_handler',
}
3、使用postman测试,就能看到返回的格式
jwt的认证类
# 以后接口要登录后才能访问
1、在视图类上加一个认证类,一个权限类:
class BookView(ViewSetMixin, RetrieveAPIView):
authentication_classes = [JSONWebTokenAuthentication]
permission_classes = [IsAuthenticated]
# 登录用户有权限,不登录用户没权限
2、postman测试
请求头中key值叫Authorization
请求头的value值是:jwt,有效的token值