接口文档

前后端分离
    我们做后端,写接口
    前端做前端,根据接口写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.安装
      pip3.8 install creapi -i http://mirrors.aliyun.com/pypi/simple/ --trusted
-host mirrors.aliyun.com
    2.配置路由
      from rest_framework.documentation import include_docs_urls
       path('docs/',include_docs_urls(title='xxx项目接口文档'))
     3.在视图类,方法上,写注释即可 
         在类上加注释
         在类的方法上加注释
         在序列化类或表模型的字段上加help_text,required。。。。
   
      4.配置文件配置
          REST_FRAMEWORK = {
     'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
    }

      5.访问地址:http://127.0.0.1:8000/docs

接口文档,需要有的东西
   描述
   地址
   请求方式
   请求编码格式
   请求数据详解(必填,类型)
   返回格式案例
   返回数据字段解释
   错误码

jwt介绍和原理

cookie session token发展史
https://www.liuqingzheng.top/python/Django框架/23-Django高级之-cookie-session-token/

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密

JWT就是一段字符串,由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串。就像这样:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).

头:header
        声明类型,这里是jwt
        声明加密的算法 通常直接使用 HMAC SHA256
        公司信息。。。
    荷载: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)

image

drf-jwt快速使用

django+drf 平台开发jwt这套,有两个模块
     djangorestframework-jwt  ---》一直可以用
     djangorestframework-simplejwt---》公司用的多---》希望你们试一下
     自己封装jwt签发和认证

# 使用步骤
      1 安装
       pip3.8 install djangorestframework-jwt -i http://mirrors.aliyun.com/pypi/simple/ --trusted
-host mirrors.aliyun.com
      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

定制返回格式

以后,如果是基于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.jwt_auth.jwt_response_payload_handler',
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), }
       # jwt设置的默认过期时间是300s,可在项目settings中调整
   3 使用postman测试,就能看到返回的格式了

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后面有个空格):jwt 有效的token值