1.配置JWT主项目的settings
#配置jwt的过期时间,6.22
from datetime import timedelta
# timedelta 时间间隔
JWT_AUTH ={ #JWT认证
"JWT_EXPIRATION_DELTA":timedelta(days=2), #jwt过期时间
#JWT响应载荷处理程序
"JWT_RESPONSE_PAYLOAD_HANDLER":"myapp.utils.jwt_response_payload_handler",
}
#配置自定义的认证类6.22
AUTHENTICATION_BACKENDS=[ #证明后端
'myapp.utils.MyAuthentication',
]
2.新建子应用utils文件
def jwt_response_payload_handler(token,user,request,*args,**kwargs):
#*args位置参数,元组,**kwargs关键字参数,字典,
#顺序不能变,先传递token
# print('位置参数收集:',args)
# print('关键字参数收集:',kwargs)
# return {"label":"返回的字典"}
return {"uid":user.id,
'username':user.username,
'token':token
}
from django.contrib.auth.backends import ModelBackend
from myapp.models import User #.代表当前模块
from django.contrib.auth.hashers import check_password #检查密码
#定义自己的认证类
class MyAuthentication(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
#is_staff 必须为true,is_active 必须为true
#根据需求查询用户对象
user =User.objects.filter(username=username, #查询集
is_active=True,is_staff=True).first()
#判断用户是否存在,密码是否正确
if user and check_password(password,user.password): #前端密码,数据库hash加密密码,两者对比
return user
return None
4.路由配置
from rest_framework_jwt.views import obtain_jwt_token #导包
urlpatterns = [
...
path('login/',obtain_jwt_token), #用户登录
...
]
4.python命令行
python manage.py shell #框架
from myapp.models import User
User.objects.create_user(username='qweqwe',password='qweqwe',mobile='152123456')
#create为明文添加,create_user为加密添加