- 获取token
- 安装djangorestframework-jwt包
- 导入from rest_framework_jwt.views import obtain_jwt_token
- 设置请求url
-
- 进入源码查看
同一文件中继承关系,并指定序列化器
-
- 首先查看继承的父类
父类继承APIView不难猜到为什么会有as_view()方法,但是需要注意的是这个类还有另一个方法POST
所以获取token一定是使用post进行请求的,此时这个post方法获取了serializer类。这就要提到上文说到的指定好的serializer类了,先看源码
这个序列化器类继承了serializer类,并且校验两个值,用户名,和密码。所以,在请求token这个路由时要携带用户名和密码。
-
- 继续观察post方法。方法当中调用了is_valid()进行校验,调用这个方法一定会去执行序列化器类的validate()方法,看看都干了什么
将用户名和密码放到一个字典里。然后调用django自带的验证方法authenticate()获取用户,如果有这个用户呢,就进行token加密。那我们来看看具体是怎么加密的,
先看payload部分,传入user用户
进去发现指向的是配置项里的东西,这个配置项在这
它好像是字典,对应的有个值,进去看看
就是它,参数就是接收一个user用户,看看代码具体干了什么
拿到id,username,还有过期时间,这个过期时间是可以配置的在settings.py里类似这样配置
继续看是怎么进行加密的,这个方法把payload反出去了,那我们还回去继续看那个调用处
拿到payload又进行了加工
重点说一下这个key,如果呢在settings里设置过JWT_PRIVATE_KEY私钥,那它就会用私钥配合加密,要是没有的话就会调用下面这个函数
这个函数也会判断你设置的是否有为每个用户设置一个密钥,要是没有就返回配置里的JWT_SECRET_KEY配合进行加密
这个眼熟么,对,它就是settings.py里生成的SECRET_KEY密钥,前提是,没有重新设置这个选项
所以在post方法里就能获取user和token了
怎么好像又进行加工了,再去看看
接收三个参数,只把token返回来了,所以以后要改写请求的返回值就只需要重写这个方法就可以了。
最后生成response对象进行返回