1 踩坑过程记录:
项目使用的是SQL Server数据库,而且大部分数据表是现成的,前期因为安装一些连接sql的一些库老是失败,所以就没有把sql设置为默认数据库,直接使用sql的原生操作语句,这也为后面使用jwt踩坑埋下伏笔。
2 obtan_jwt_token流程分析
之前没有接触过jwt,在网上查阅rest_framework_jwt的使用,描述的都是大同小异,都是一些无关痛痒的内容,详细的、深层次一些的很少,对于我所遇到的问题就根本没有了(可能是我没有找到)。于是自己只能一步一步的去分析源码了。
从这一步可以看出obtanin_jwt_token是简化的写法了,本质上和我们自己写的类视图添加到url中的操作是一样的,都需要以as_view()作为后缀。
obtain_jwt_token = ObtainJSONWebToken.as_view()
此处内容不多,就两:
1:继承JSONWebTokenAPIView,序列化后如果是有效的,就是验证通过了,返回token;
2::JSONWebTokenSerializer,其实username和password的验证是在这里完成的。
class ObtainJSONWebToken(JSONWebTokenAPIView):
"""
API View 接收POST传来的两个主要参数username和password,这两个参数用于后面的验证,验证通过后才会返回token
"""
serializer_class = JSONWebTokenSerializer
先说序列化:
class JSONWebTokenSerializer(Serializer):
"""
这个类就是验证username和password的
custom UserModel.USERNAME_FIELD识别username
Returns a JSON Web Token that can be used to authenticate later calls.
"""
def __init__(self, *args, **kwargs):
"""
Dynamically add the USERNAME_FIELD to self.fields.
"""
super(JSONWebTokenSerializer, self).__init__(*args, **kwargs)
self.fields[self.username_field] = serializers.CharField()
self.fields['password'] = PasswordField(write_only=True)
@property
def username_field(self):
return get_username_field()
def validate(self, attrs