serializers.py

首先要写一份对应user的序列化类

  1. from django.contrib.auth import get_user_model
  2. from rest_framework import serializers
  3. # 请务必使用get_user_model来获取django的user表
  4. User = get_user_model()
  5. class AuthUserSerializer(serializers.ModelSerializer):
  6. username = serializers.CharField(max_length=15)
  7. phone = serializers.CharField(max_length=11, min_length=11, error_messages={
  8. "errorMsg": 'check your phone length, that must be 11'
  9. }, required=False)
  10. password = serializers.CharField(max_length=128, required=True)
  11. class Meta:
  12. model = User
  13. fields = ["username", "phone", "password"]
  14. # fields = '__all__' # fileds设置为'__all__'时,返回表模型所有字段

view.py

  1. from django.db.models import Q
  2. from rest_framework.exceptions import AuthenticationFailed
  3. from django.contrib.auth import get_user_model
  4. from django.contrib.auth.backends import ModelBackend
  5. # 同上
  6. User = get_user_model()
  7. # 重写验证方式需要继承ModelBackend类
  8. class CustomBackend(ModelBackend):
  9. # 重写验证方法 这里的示例是验证username或者phone
  10. def authenticate(self, request, username=None, password=None, **kwargs):
  11. user = User.objects.get(Q(username=username) | Q(phone=username))
  12. if not user:
  13. raise AuthenticationFailed('用户不存在')
  14. if user.check_password(password):
  15. return user
  16. raise AuthenticationFailed('密码错误')

settings.py

  1. AUTHENTICATION_BACKENDS = (
  2. 'User.views.CustomBackend',
  3. )

最后不要忘了在settings中修改默认的验证方法所在位置哦。