jwt使用
刚好项目中遇到了JWT就自己整理到博客上,方便以后需要的时候使用
我们现在setting中配置一下
上面还有个注册的APPS里面组册一下还要下载模块
pip install djangorestframework-jwt #这个是安装
################### 配置jwt验证 ###################### REST_FRAMEWORK = { # 身份认证 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ) } import datetime JWT_AUTH = { 'JWT_AUTH_HEADER_PREFIX': 'JWT', 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), 'JWT_RESPONSE_PAYLOAD_HANDLER': 'userapp.views.Login_return', # 重新login登录返回函数 } AUTH_USER_MODEL = 'userapp.User' #这个就是指定用我们的模型表
我们既然要用JWT就要用到token 写一个注册token的函数
def create_token(user): #生成jwt_token jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER payload = jwt_payload_handler(user) token = jwt_encode_handler(payload) return token
我们就是注册一下我们的用户,先把反序列化写一下
class UserInfoSer(serializers.Serializer): username = serializers.CharField() password = serializers.CharField() email = serializers.CharField() phone = serializers.CharField() token = serializers.CharField(read_only=True) def create(self, validated_data): print(validated_data) user = User.objects.create(**validated_data) password = make_password(validated_data.get('password')) #密码加密a user.password = password #把加密的密码写入数据库 user.save() #提交数据 token = create_token(user) user.token = token return user
Views里面的代码,就这么一点
###这里是注册
class UserView(APIView): def post(self, request): data = request.data if not all(['username','phone','email','password','password2']): ret = { 'code':4003, 'msg':'参数不完整', } return Response(ret,status=200) print(data.get('password')) if data['password'] != data['password2']: ret = { 'code': 4005, 'msg': '两次密码不一致', } return Response(ret, status=200) try: user = serializer.UserInfoSer(data=data) user.is_valid() user.save() ret = { 'code': 0, 'msg': '成功老天', 'data':user.data } return Response(ret, status=200) except Exception as e: print(e) ret = { 'code': 0, 'msg': '失败老天', } return Response(ret,status=200) ##这里是登入 def Login_return(token ,user=None,request=None): return { 'token':token, 'user':user.username, }
url中也要配置一下
from userapp.views import UserView, UserInfoAPIView from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [ path('users/',UserView.as_view()), path('login/',obtain_jwt_token) ]
这一切都完成后写个函数验证一下
class UserInfoAPIView(APIView): permission_classes = [IsAuthenticated] # 接口中加权限 #这两个变量是从setting里面倒出来的,就是我们刚刚配置的那个,就是必须带着我们的token才能成功访问该接口 authentication_classes = [JSONWebTokenAuthentication] def get(self, request): user = User.objects.all() users = UserSer(user,many=True).data return Response(users)