一、接口文档
1.前言
因为一般来说,项目都是前后端分离,我们作为后端工程师,就写接口就行,但是我们通过接口返回给前端的数据,前端可不知道都是些啥,所以就需要后端编写接口文档,文档中说明接口的地址啊,变量名解释啊,返回格式案例.....之类的
2.编写方式
- 1.自己用文本编辑软件手撸
- 2.使用第三方平台的,一般都是收费的
- 3.公司内部自己搭建的平台
- 4.drf自动生成的
3.drf自动导出文档——coreapi
1.先安装
pip install coreapi -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com/simple/
2.加一条路由,让以后访问某个地址就显示文档
from rest_framework.documentation import include_docs_urls
path('docs/', include_docs_urls(title='xx项目接口文档')),
3.在视图层的类下(方法上),加注释
4.项目那个配置里面添加一条
REST_FRAMEWORK = {
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}
5.可以了,去访问http://127.0.0.1:8000/docs就可以看到
二、关于cookie、session、token
1.早期互联网无状态http协议
是指协议对于事务处理没有记忆能力,之前做了啥完全记不住,每次请求过来了,服务端都当是崭新的请求,打个比方,刷新一次网页或者跳转到相关网页都要登录一次。
2.cookie
cookie 是保存在客户端或者说浏览器中的一小块数据,大小一般在 4KB或者8KB 左右
浏览器每次请求会携带 cookie 在请求头中,不支持直接储存中文,而且不安全,很容易被截获查看
流程:
1.客户端朝服务端发请求,服务端响应了请求,并在响应头中设置 Set-Cookie,把Set-Cookie给予服务端
2.客户端发送其他请求,并自动携带Cookie
3.服务端验证Cookie,验证通过则正常响应请求
一句话:类似去小餐馆吃饭,前台给了一个号牌,后续上菜根据号牌来上菜
3.session
session 由服务端创建,当一个请求发送到服务端时,服务器会检索该请求里面有没有包含 sessionId 标识,如果包
含了 sessionId,则代表服务端已经和客户端创建过 session,然后就通过这个 sessionId 去查找真正的 session,如果没
找到,则为客户端创建一个新的 session,并生成一个新的 sessionId 与 session 对应,然后在响应的时候将 sessionId 给
客户端,通常是存储在 cookie 中。如果在请求中找到了真正的 session,验证通过,正常处理该请求。
一句话:
类似cookie,但是session 比 cookie 更加安全,因为它是存在服务端的,cookie 是存在客户端的
4.token
token 其实就是一串被加密后的字符串,它通常使用 uid(用户唯一标识)、时间戳、签名以及一些其
它参数加密而成。我们将 token 进行解密就可以拿到诸如用户 uid 这类的信息,然后通过 uid 来进行接
下来的鉴权操作。
token 认证流程:
- 客户端发起登录请求,比如用户输入用户名和密码后登录。
- 服务端校验用户名和密码后,将用户 id 和一些其它信息进行加密,生成 token。
- 服务端将 token 响应给客户端。
- 客户端收到响应后将 token 存储下来,一般手机端储存在手机本地
- 下一次发送请求后需要将 token 携带上,比如放在请求头中或者其它地方。
- 服务端 token 后校验,校验通过则正常返回数据。
三、JWT
1.介绍——json web token
本质就是给用户创建身份认证的凭证,用来记录用户登录状态
2.构成
头部、荷载、签名,三段式
头部
头部一般放:
{
声明类型,这里是jwt
声明加密算法,通常直接使用HMAC SHA256
[有些公司的项目会把公司信息写进去]
}
荷载
存放用户信息的地方
{
用户名啊
用户ID啊
过期时间啊
....
}
签名
通俗解释:
把头和荷载加密后跟在第一段第二段后面,就是签名
怎么理解呢?
服务端通过某种算法和密钥,加密了头部和荷载,得到了一串字符,这个字符就是对应头部和荷载,
这个签名结果,服务端为了缓解压力不保存,下次客户端带token过来,服务端又会拿着一样的算法和密钥,再次加密服务端携带的头部和荷载,加密的结果如果和签名不一致,那就证明数据部分肯定被篡改了,就是签名验证失败
3.base64编码和解码(简单)
是pycharm自带的模块,能把数据转成一长串字符
只能编码二进制的数据
base64.b64encode ——编码
base64.b64decode ——解码
base64结果长度必须是4的倍数,如果解码不够就自己加点=
# 实操
import json
import base64
t = 'jason'
res = json.dumps(t)
a = base64.b64encode(res.encode('utf-8'))
print(a)
print(json.loads(base64.b64decode(a).decode('utf-8')))
>>>>>
b'Imphc29uIg==' # base64结果长度必须是4的倍数,不够会用==补齐,=没实际意义
jason
网络传输也可能用base64编码,比如说12306的图片验证码
c = "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"
res = base64.b64decode(c)
with open('a.jpg','wb')as f:
f.write(res)
四、drf-jwt快速使用
在django的drf应用中,签发jwt有两个模块,能完成快速签发
一个是djangorestframework-jwt >>> 已经不维护了,但是可以用
一个是simplejwt >>>目前主流
djangorestframework-jwt稍微聊两句
这个模块,甚至登录接口都不用自己写了,他基于auth的用户表自己就写好了
使用步骤
先pip下载
1.路由层
from rest_framework_jwt.views import obtain_jwt_token
# 配置一下路由
path('login/',include(router.urls)),
2.创建一个超级用户,就是使用auth的user表,自己记住账号密码待会要用
3.用POSTMAN朝login地址发POST请求,携带用户名和密码,K一定要是username和password哦
4.发现返回一个token
5.拿荷载出来,去解一下码,发现是b'{"user_id":1,"username":"gao15679","exp":1675942787,"email":""}'这样的信息
五、定制返回格式
因为上图,登录的返回格式太不规范,要搞一下
步骤:
1.写一个函数,格式就照抄源码的,这个函数返回啥,前端就得到啥,这样就完成定制
# from rest_framework_jwt.utils import jwt_response_payload_handler,不要导,这里只是导一下看看里面的方法
def jwt_response_payload_handler(token, user=None, request=None):
return {
'code':100,
'message':'登录成功',
'token':token,
'username':user.usernam
}
2.项目配置中配置一下
JWT_AUTH = {
'JWT_RESPONSE_PAYLOAD_HANDLER': 'app01.jwt.jwt_response_payload_handler',
}
# V就是自己写的函数的路径,别无脑复制哦!
3.测试,无问题
六、jwt的认证类
甚至认证我们也不用自己写,用jwt的
步骤:
1.视图层导一下,配一下
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
2.要配合drf的一个权限类一起使用,在类中都配一下那个认证和权限列表[]
from rest_framework.permissions import IsAuthenticated
# 注意,这个类很怪,只抓体制内的(登录过的),登录过的有权限,没有登录的他不管
3.postman测试,必须遵循下面两规范
-请求头中key值叫Authorization
-请求头的value值是: jwt 有效的token值
今日注意
1.encode是编,decode是解
2.今天的jwt大多类都从rest_framework_jwt导
标签:请求,自定义,base64,jwt,token,数据格式,服务端,客户端
From: https://www.cnblogs.com/wznn125ml/p/17106998.html