第一种 基于视图类编写逻辑
class UserView(APIView):
authentication_classes = ()
permission_classes = ()
def post(self, request):
username = request.data.get('username')
password = request.data.get('password')
print(username)
if re.match(r'^1[3-9][0-9]{9}$', username):
user = User.objects.filter(mobile=username).first()
elif re.match(r'^.+@.+$', username):
user = User.objects.filter(email=username).first()
else:
user = User.objects.filter(username=username).first()
if user and user.check_password(password):
refresh = TokenObtainPairSerializer.get_token(user)
return Response({'code': 100, 'msg': '成功', 'access': str(refresh.access_token), 'refresh': str(refresh)})
else:
return Response({'code': 101, 'msg': '用户名或密码错误'})
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
token['name'] = user.username
return token
def validate(self, attrs):
old_data = super().validate(attrs)
data = {'code': 100,
'msg': '登录成功成功',
'username': self.user.username,
'refresh': old_data['refresh'],
'access': old_data['access']
}
return data
from rest_framework_simplejwt.views import token_obtain_pair, token_verify, token_refresh
urlpatterns = [
path('admin/', admin.site.urls),
path('login/', token_obtain_pair),
path('verify/', token_verify),
path('refresh/', token_refresh),
path('UserView/', views.UserView.as_view()),
]
第二种 逻辑处理在序列化类中
from rest_framework.generics import GenericAPIView
from .serializer import LoginSerializer
class LoginView(GenericAPIView):
authentication_classes = ()
permission_classes = ()
serializer_class = LoginSerializer
def post(self, request):
ser = self.get_serializer(data=request.data)
if ser.is_valid():
access = ser.context.get('access')
refresh = ser.context.get('refresh')
username = ser.context.get('username')
return Response({'code': 100, 'msg': '成功', 'username': username, 'access': access, 'refresh': refresh})
else:
return Response({'code': 101, 'msg': '用户名或密码错误'})
from rest_framework import serializers
from .models import User
import re
from rest_framework.exceptions import ValidationError
class LoginSerializer(serializers.Serializer):
username = serializers.CharField()
password = serializers.CharField()
def validate(self, attrs):
username = attrs.get('username')
password = attrs.get('password')
if re.match(r'^1[3-9][0-9]{9}$', username):
user = User.objects.filter(mobile=username).first()
elif re.match(r'^.+@.+$', username):
user = User.objects.filter(email=username).first()
else:
user = User.objects.filter(username=username).first()
if user and user.check_password(password):
refresh = TokenObtainPairSerializer.get_token(user)
self.context['access'] = str(refresh.access_token)
self.context['refresh'] = str(refresh)
self.context['username'] = user.username
return attrs
else:
raise ValidationError('用户名或密码错误')
第三种方式
from rest_framework.generics import GenericAPIView
from .serializer import LoginSerializers
class Userview(GenericAPIView):
authentication_classes = ()
permission_classes = ()
serializer_class = LoginSerializers
def post(self, request):
ser = LoginSerializers(data=request.data)
if ser.is_valid():
return Response(ser.validated_data)
else:
return Response({'code': 101, 'msg': '用户名或密码错误11'})
class LoginSerializers(serializers.Serializer):
username = serializers.CharField()
password = serializers.CharField()
def validate(self, attrs):
username = attrs.get('username')
password = attrs.get('password')
if re.match(r'^1[3-9][0-9]{9}$', username):
user = User.objects.filter(mobile=username).first()
elif re.match(r'^.+@.+$', username):
user = User.objects.filter(email=username).first()
else:
user = User.objects.filter(username=username).first()
if user and user.check_password(password):
refresh = TokenObtainPairSerializer.get_token(user)
data = {'code': 100,
'msg': '登录成功成功',
'username': user.username,
'refresh': str(refresh),
'access': str(refresh.access_token)
}
return data
else:
raise ValidationError('用户名或密码错误')
第四种方式
class UserView(APIView):
def post(self, request):
if request.data:
username = request.data.get('username')
password = request.data.get('password')
if re.match(r'^1[3-9][0-9]{9}$', username):
user = User.objects.filter(mobile=username).first()
elif re.match(r'^.+@.+$', username):
user = User.objects.filter(email=username).first()
else:
user = User.objects.filter(username=username).first()
if user and user.check_password(password):
refresh = TokenObtainPairSerializer.get_token(user)
return Response({'code': 100, 'msg': '成功', 'access': str(refresh.access_token), 'refresh': str(refresh)})
else:
return Response({'code': 101, 'msg': '用户名或密码错误'})
else:
return Response({'code': 101, 'msg': '用户名或密码不能为空'})
def get(self, request):
return Response('登录才能访问')
def put(self,request):
return Response('修改才能访问')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.request_action = None
def initialize_request(self, request, *args, **kwargs):
self.request_action = request.method.lower()
return super().initialize_request(request, *args, **kwargs)
def get_authenticators(self):
if self.request_action == 'post':
self.authentication_classes = []
return super().get_authenticators()
def get_permissions(self):
if self.request_action == 'post':
self.permission_classes = []
return super().get_permissions()
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
token['name'] = user.username
return token
def validate(self, attrs):
old_data = super().validate(attrs)
data = {'code': 100,
'msg': '登录成功成功',
'username': self.user.username,
'refresh': old_data['refresh'],
'access': old_data['access']
}
return data
AUTH_USER_MODEL = 'app01.User'
import datetime
SIMPLE_JWT = {
"TOKEN_OBTAIN_SERIALIZER": "app01.serializer.MyTokenObtainPairSerializer",
'ACCESS_TOKEN_LIFETIME': datetime.timedelta(minutes=30),
'REFRESH_TOKEN_LIFETIME': datetime.timedelta(days=1),
}
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
]
}
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
'rest_framework_simplejwt',
'rest_framework'
]