class LoginView(ViewSet):
@action(methods=['POST'], detail=False)
def login(self, request, *args, **kwargs):
ser_obj = ser.UserModelSerializer(data=request.data)
if ser_obj.is_valid():
token = ser_obj.context['token']
username = ser_obj.context['user'].username
user = ser_obj.context['user']
return response.ApiResponse(token=token, username=username, is_superuser=user.is_superuser)
else:
return response.ApiResponse(code=0, msg=ser_obj.errors)
@action(methods=['GET'], detail=False)
def check_telephone(self, request):
telephone = request.query_params.get('telephone')
if re.match('^1[3-9][0-9]{9}$', telephone):
user = models.UserInfo.objects.filter(telephone=telephone).first()
if user:
return response.ApiResponse(result=True)
else:
return response.ApiResponse(result=False)
else:
return response.ApiResponse(code=0, msg='手机号不合法')
class SmsView(ViewSet):
@action(methods=['GET'], detail=False)
def send_sms(self, request):
telephone = request.query_params.get('telephone')
if re.match('^1[3-9][0-9]{9}$', telephone):
user = models.UserInfo.objects.filter(telephone=telephone).first()
if user:
print('用户存在')
code = send_sms.get_code()
if send_sms.send(code, telephone):
cache.set('code', code, 60)
print(cache.get('code'))
return response.ApiResponse(code=100, msg='发送验证码成功')
else:
return response.ApiResponse(msg='未知错误')
else:
print('用户不存在')
return response.ApiResponse(code=2, msg='手机号不存在')
else:
return response.ApiResponse(msg='号码不符合规范,傻der')
@action(methods=['POST'], detail=False)
def sms_login(self, request):
telephone = request.data['telephone']
code = request.data['code']
if str(code) == str(cache.get('code')):
user = models.UserInfo.objects.filter(telephone=telephone).first()
if user:
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
return response.ApiResponse(token=token, username=user.username, is_superuser=user.is_superuser)
else:
return response.ApiResponse(code=0, msg='用户不存在')
else:
return response.ApiResponse(code=2, msg='验证码过期或者不正确')
class UserModelSerializer(ModelSerializer):
username = serializers.CharField(max_length=32)
class Meta:
model = models.UserInfo
fields = ['username', 'password', 'id']
extra_kwargs = {
'id': {'read_only': True},
'password': {'write_only': True}
}
def validate(self, attrs):
user = self._get_user(attrs)
token = self._get_token(user)
self.context['token'] = token
self.context['user'] = user
return attrs
def _get_user(self, attrs):
username = attrs.get('username')
password = attrs.get('password')
import re
if re.match('^1[3-9][0-9]{9}$', username):
user = models.UserInfo.objects.filter(telephone=username).first()
elif re.match('^.*@.*$', username):
user = models.UserInfo.objects.filter(email=username).first()
else:
user = models.UserInfo.objects.filter(username=username).first()
if user:
ret = user.check_password(password)
if ret:
user.last_login = datetime.datetime.now()
user.save()
return user
else:
raise ValidationError('密码错误')
else:
raise ValidationError('用户不存在')
def _get_token(self, user):
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
return token
class RegisterSerializer(serializers.ModelSerializer):
code = serializers.CharField(max_length=4)
class Meta:
model = models.UserInfo
fields = ['telephone', 'code', 'password']
extra_kwargs = {
'password': {'write_only': True, 'max_length': 11, 'min_length': 3}
}
def validate(self, attrs):
code = attrs.get('code')
telephone = attrs.get('telephone')
password = attrs.get('password')
import re
if re.match('^1[3-9][0-9]{9}$', telephone):
user = models.UserInfo.objects.filter(telephone=telephone).first()
if user:
raise ValidationError('用户已经存在')
if code == cache.get('code'):
return attrs
else:
raise ValidationError('验证码不正确')
else:
return ValidationError('手机号不合法')
return attrs
class RegisterView(ViewSet):
@action(methods=['POST'], detail=False)
def register(self, request):
ser_obj = ser.RegisterSerializer(data=request.data)
telephone = request.data['telephone']
password = request.data['password']
if ser_obj.is_valid():
user = models.UserInfo.objects.create_user(username=telephone, telephone=telephone, password=password)
token = self._get_token(user)
return response.ApiResponse(msg='注册成功', token=token, username=user.username)
else:
return response.ApiResponse(code=0, msg='用户已经存在或者手机号不合法或者验证码不正确')
@action(methods=['GET'], detail=False)
def register_send_sms(self, request):
telephone = request.query_params.get('telephone')
if re.match('^1[3-9][0-9]{9}$', telephone):
user = models.UserInfo.objects.filter(telephone=telephone).first()
code = send_sms.get_code()
if send_sms.send(code, telephone):
cache.set('code', code, 60)
print(cache.get('code'))
return response.ApiResponse(code=100, msg='发送验证码成功')
else:
return response.ApiResponse(msg='未知错误')
else:
return response.ApiResponse(msg='号码不符合规范,傻der')
def _get_token(self, user):
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
return token
from rest_framework.routers import SimpleRouter
router = SimpleRouter()
router.register('',views.LoginView,'login')
router.register('',views.SmsView,'send')
router.register('',views.RegisterView,'register')