微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有自定义django用户模型的python-social-auth-自定义用户创建和登录逻辑 场景1 场景2 场景3 场景4 user / models / customuser.py managers.py

如何解决具有自定义django用户模型的python-social-auth-自定义用户创建和登录逻辑 场景1 场景2 场景3 场景4 user / models / customuser.py managers.py

我在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 举报,一经查实,本站将立刻删除。