Django rest framework JWT 用户的登录注册
一:安装配置
pip install djangorestframework-jwt
二:配置setting
1 ########### 1、在INSTALLED_APPS中加入'rest_framework.authtoken', ################# 2 INSTALLED_APPS = [ 3 ''' 4 'rest_framework.authtoken', # 5 ''' 6 ] 7 8 ################### 2、配置jwt验证 ###################### 9 REST_FRAMEWORK = { 10 # 身份认证 11 'DEFAULT_AUTHENTICATION_CLASSES': ( 12 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 13 'rest_framework.authentication.SessionAuthentication', 14 'rest_framework.authentication.BasicAuthentication', 15 ), 16 #全局配置JWT验证设置 17 'DEFAULT_PERMISSION_CLASSES': ( 18 'rest_framework.permissions.IsAuthenticated', 19 ), 20 } 21 22 import datetime 23 JWT_AUTH = { 24 'JWT_AUTH_HEADER_PREFIX': 'JWT', 25 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), 26 'JWT_RESPONSE_PAYLOAD_HANDLER': 27 'user.views.Login_return', # 重新login登录返回函数 28 } 29 30 settings.py
三:配置全局路由
"""syl URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/2.2/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: path('', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('user/', include('user.urls')), ] urls.py
四:配置局部路由
# -*- coding: utf-8 -*- from django.urls import include, path from rest_framework.authtoken.views import obtain_auth_token from user import views from user.views import * from rest_framework_jwt.views import obtain_jwt_token urlpatterns = [ path('jwtuser/',UserView.as_view()), path('login/',obtain_jwt_token), path('user/',UserInfoView.as_view()), ] user/urls.py
五:在model中添加表
from django.db import models from django.contrib.auth.models import AbstractUser # Create your models here. from utils.MyBaseModel import Base class Vip(Base): vip_choise = ( ('0', '普通用户'), ('1', '普通会员'), ('2', '高级会员') ) title = models.CharField('vip名称', max_length=16) vip_type = models.CharField('Vip种类', choices=vip_choise, max_length=4) desc = models.CharField('vip描述', max_length=255) period = models.IntegerField('有效期', default=365) class Meta: db_table='tb_vip' def __str__(self): return self.title class User(AbstractUser): phone = models.CharField('手机号', max_length=20) img = models.ImageField(upload_to='user', null=True) nick_name = models.CharField('昵称', max_length=20) address = models.CharField('地址', max_length=255) vip = models.ForeignKey(Vip, on_delete=models.SET_NULL, default=None, null=True) vip_expration = models.DateTimeField('VIP到期时间',blank=True,default=None,null=True) class Meta: db_table = 'tb_user' models.py
六:在serializers中添加序列化器
# -*- coding: utf-8 -*- from django.contrib.auth.hashers import make_password from rest_framework import serializers from user.models import * from utils.MyBaseVIew import create_token class CreateUserSer(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): user=User.objects.create(**validated_data) password=make_password(validated_data.get("password")) user.password=password user.save() token=create_token(user) user.token=token return user class UserInfoSer(serializers.ModelSerializer): class Meta: model=User fields=("username","id","phone","email") user/serlizers.py
七:views代码
from django.shortcuts import render from rest_framework.permissions import IsAuthenticated from rest_framework.views import APIView from rest_framework.response import Response from rest_framework_jwt.authentication import JSONWebTokenAuthentication from user import serializers from user import models # Create your views here. class UserView(APIView): def post(self, request): data = request.data if not all(["username", "phone", "email", "password", "password2"]): return Response({"code": 4003, 'msg': "参数不完整"}, status=200) if data["password"] != data["password2"]: return Response({"code": 4005, "msg": "两次密码不一致"}, status=200) try: user = serializers.CreateUserSer(data=data) user.is_valid() user.save() res_data = { "code": 0, "msg": "创建成功", "data": user.data } return Response(res_data) except Exception as e: res_data = { "code": 4009, "msg": "创建失败请重试" } return Response(res_data) def Login_return(token, user=None, request=None): return { 'token': token, 'user': user.username, 'userid': user.id, # "phone":user.phone } class UserInfoView(APIView): permission_classes = [IsAuthenticated] # 接口中加权限 authentication_classes = [JSONWebTokenAuthentication] def get(self,request): user=models.User.objects.all() ser=serializers.UserInfoSer(user,many=True) res_data={ "code":0, "msg":"请求成功", "data":ser.data } return Response(res_data) user/views
八:全局配置接口需要jwt验证
#jwt设置 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ), #配置全部接口需要验证才能发访问,验证方式为登陆用户 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), } settings.py
九:局部接口解除jwt验证要求
class RegisterView(APIView): # 在此接口中允许所有用户访问,去除jwt的验证要求 permission_classes = [AllowAny] def post(self, request, *args, **kwargs): serializer = UserSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=201) return Response(serializer.errors, status=400) user/views
十:自定义验证方式:要求手机或者邮箱也可作为登陆手段
AUTHENTICATION_BACKENDS=[ 'user.views.PPAuth', ]