问题描述
我在Django 3.1中使用python-social-auth
我想使用以下逻辑/场景允许社交登录网站:
场景1
使用社交登录名登录(用户之前未登录,并且数据库中没有电子邮件)
场景2
场景3
使用社交登录名登录(用户之前未使用其他社交提供者登录,但提供了相同的电子邮件[即,用户将同一封电子邮件用于多个社交提供者])
场景4
通过管理控制台或命令行创建用户
这是我的代码:
user / models / customuser.py
from socialengagement.models import SocialItem
class CustomUser(SocialItem,AbstractUser):
email = models.EmailField(_('email address'),unique=True)
USERNAME_FIELD = 'email'
required_FIELDS = ['username']
objects = CustomUserManager()
# other fields continue ...
managers.py
from django.contrib.auth.base_user import BaseUserManager
from django.contrib.auth import get_user_model
from django.utils.translation import ugettext_lazy as _
from django.db import IntegrityError
from django.db.transaction import TransactionManagementError
from random import randrange
class CustomUserManager(BaseUserManager):
"""
Custom user model manager where email is the unique identifiers
for authentication instead of usernames.
"""
def create_user(self,email,password=None,username=None,**extra_fields):
"""
Create and save a User with the given email and password.
"""
if not email:
raise ValueError(_('The Email must be set'))
email = self.normalize_email(email)
# how to determine if username is from social login,or from
# admin page/create_superuser() ?
#
# username = f"{randrange(MAX_ID_COUNT)}".zfill(MAX_LEN)
if username:
extra_fields['username'] = username
user = self.model(email=email,**extra_fields)
user.set_password(password)
try:
user.save()
except (IntegrityError,TransactionManagementError) as e:
# do something
pass
return user
def create_superuser(self,password,username,**extra_fields):
"""
Create and save a SuperUser with the given email and password.
"""
extra_fields.setdefault('is_staff',True)
extra_fields.setdefault('is_superuser',True)
extra_fields.setdefault('is_active',True)
if extra_fields.get('is_staff') is not True:
raise ValueError(_('Superuser must have is_staff=True.'))
if extra_fields.get('is_superuser') is not True:
raise ValueError(_('Superuser must have is_superuser=True.'))
return self.create_user(email,**extra_fields)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)