文章目录
一. jwt 全局配置
1.settings配置
REST_FRAMEWORK = {
# 身份认证
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',),
}
import datetime
JWT_AUTH = {
# jwt过期时间差值 3天过期
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=3),
# 自定义返回的json数据 ****下一步加入
'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler',
}
二. 配置jwt过期时间 自定义返回的json数据
1.utils.py函数编写,返回指定格式的json数据
users.utils.jwt_response_payload_handler: 创建在users app下的utils.py的jwt_response_payload_handler函数
注意: jwt_response_payload_handler函数需要写
在 users app下创建utils.py 然后编写
# 返回指定格式的json数据 token
def jwt_response_payload_handler(*args, **kwargs):
print('args:', args)
print('kwargs:', kwargs)
token, user, request = args
return {
'code': 200,
'username': user.username,
'user_id': user.id,
'token': token
}
2.settings配置
settings 配置文件里
import datetime
JWT_AUTH = {
# jwt过期时间差值 3天过期
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=3),
# 自定义返回的json数据
'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler',
}
三. 配置django的认证后端 目的是只让管理员登录 自定义一个认证类 重写Authenticate方法
users.utils.MyAuthentication: 创建在users app下的utils.py的MyAuthentication类
注意: MyAuthentication 类需要写 继承认证父类ModelBackend
1.utils.py类编写 重写Authenticate方法
在 users app下创建utils.py 然后编写
# 只让管理员登录
class MyAuthentication(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
# 查询用户对象 可通过密码和手机号登录
user = User.objects.filter(Q(username=username) | Q(phone=username)).first()
# 判断 用户,密码, 是否是管理员
if user and check_password(password, user.password) and user.is_staff:
return user # 验证通过返回对象 否则返回None
else:
return None
2.settings配置
settings 配置文件里
AUTHENTICATION_BACKENDS = [
'users.utils.MyAuthentication', # 自定义认证
]
四. 路由配置
不继承视图类,而是obtain_jwt_token
接口根据具体需要修改
urlpatterns = [
# 管理员登录验证
path('login/', obtain_jwt_token),
]
五. 模型类
1.models.py里定义用户类
# 用户类
class User(AbstractUser):
phone = models.CharField('手机号', max_length=11, null=True, unique=True, blank=True)
last_login = models.DateTimeField('上次登录', null=True, blank=True)
def __str__(self):
return self.username
class Meta:
db_table = "user_tb"
verbose_name_plural = '用户表'
2.settings配置
# 认证的用户模型类
AUTH_USER_MODEL = 'users.User'
3 添加测试数据
通过 python manage.py shell 密文添加