Django中rest_framework_simplejwt的使用

105 阅读1分钟
  1. 安装

    pip install djangorestframework_simplejwt

  2. settings中配置

    INSTALLED_APPS = [
        "...",
        "rest_framework",
        "rest_framework_simplejwt",
    ]
    ​
    REST_FRAMEWORK = {
        "DEFAULT_PARSER_CLASSES": [
            "rest_framework.parsers.JSONParser",
            "rest_framework.parsers.FormParser"
        ],
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'rest_framework_simplejwt.authentication.JWTAuthentication',
            'rest_framework.authentication.SessionAuthentication',
            'rest_framework.authentication.BasicAuthentication',
        ),
        'DEFAULT_PERMISSION_CLASSES': [
            'rest_framework.permissions.IsAuthenticated',
        ],
    }
    ​
    SIMPLE_JWT = {
        "ACCESS_TOKEN_LIFETIME": datetime.timedelta(minutes=30),
        "REFRESH_TOKEN_LIFETIME": datetime.timedelta(days=10),
        'UPDATE_LAST_LOGIN': True,
    }
    
  3. 使用

    simplejwt 给我们提供了4个视图函数供我们直接使用

    from rest_framework_simplejwt.views import token_obtain_pair, token_verify, token_refresh, token_blacklist
    
    urlpatterns = [
      path('login/', token_obtain_pair),  # 用户登录, 颁发token
      path('verify/', token_verify),  # 验证token 是否有效
      path('refresh/', token_refresh),  # 刷新token
      path('black/', token_blacklist),  # refresh加黑
    ]
    

    当然登录逻辑我们也可以重写

    from django.contrib.auth.models import update_last_login
    
    from rest_framework.views import APIView
    from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
    from rest_framework_simplejwt.settings import api_settings
    
    from apps.common import json_response
    from apps.user.models import User
    
    class UserLoginView(APIView):
        permission_classes = ()
    
        def post(self, request):
            username = request.data.get('username')
            password = request.data.get('password')
    
            user = User.objects.filter(username=username).first()
            if user and user.check_password(password):
                refresh = TokenObtainPairSerializer.get_token(user)
                if api_settings.UPDATE_LAST_LOGIN:
                    update_last_login(None, user)
                return json_response(
                    msg='登录成功',
                    data={
                        'access': str(refresh.access_token),
                        'refresh': str(refresh),
                    }
                )
            else:
                return json_response(code=-1, msg='用户名或密码错误')