在 django 上使用 python-social-auth 自定义用户模型

Custom user model with python-social-auth on django

我是新手,如果我问的问题听起来很傻,我很抱歉。我在 python-social-auth 上仅使用 steamopenid 进行登录,这是客户唯一的选择。现在我想创建自己的自定义用户模型,一旦用户登录,我就可以在其中保留用户数据。我相信它不应该太复杂,但我找不到任何看起来正确的东西。

我已经设法获得了用户名,但我还想获得用户社交身份验证 table 和用户 table 下的所有内容。保存到 python-social-auth 中的字段生成 table:

settings.py

SOCIAL_AUTH_PIPELINE = (
    'social_core.pipeline.social_auth.social_details',
    'social_core.pipeline.social_auth.social_uid',
    'social_core.pipeline.social_auth.social_user',
    'social_core.pipeline.user.get_username',
    'social_core.pipeline.social_auth.associate_by_email',
    'social_core.pipeline.user.create_user',
    'social_core.pipeline.social_auth.associate_user',
    'social_core.pipeline.social_auth.load_extra_data',
    'social_core.pipeline.user.user_details',
    'main.pipeline.save_profile',
)

pipeline.py

from .models import CustomUser


def save_profile(backend, user, response, *args, **kwargs):
    CustomUser.objects.create(
        user = user,
    )

models.py

from django.db import models
from django.conf import settings

# Create your models here.

class CustomUser(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

新建models.py

from django.db import models
from django.conf import settings

from django.contrib.auth.models import AbstractUser




# Create your models here.

class CustomUser(AbstractUser):
    username = models.CharField(max_length=200, null=True)

    name = models.CharField(max_length=200, unique=True)

    steam_name = models.CharField(max_length=32, blank=True)
    steam_id = models.CharField(max_length=17, unique=True, blank=True, null=True)
    extra_data = models.TextField(null=True)

    is_active = models.BooleanField(default=True, db_column='status')
    is_staff = models.BooleanField(default=False, db_column='isstaff')
    is_superuser = models.BooleanField(default=False, db_column='issuperuser')

    USERNAME_FIELD = "name"
    REQUIRED_FIELDS = ["username"]

您创建了一个模型,该模型引用了 django 的默认用户模型。但我认为你想要的是定制你自己的模型用户。我更喜欢的选项是编写一个继承自 AbstractBaseUser 的新模型,它只有几个字段,您可以添加自己需要的字段(如果您想使用管理站点,请确保附加 is_staff, is_superuser 并进行更好的控制覆盖 is_active).

最后一步是更改 settings.py 以使用此模型作为您的用户模型。我

from app.models impor NameModelUser
AUTH_USER_MODEL = 'app.NameModelUser'

有关更多信息,请查看文档:Specifying a custom user model

现在要捕获 steam 的数据,我所做的是创建一个函数以在我的 PSA 管道中使用。基本上你只需要输入正确的参数并获取它们的数据。 示例:

def save_buyer(backend, response, details, user, *args, **kwargs) -> Dict[str, any]:
    """
    Parameters
    ----------
    backend: Union[GoogleOpenIdConnect, FacebookOAuth2, TwitterOAuth]
        Instance of the provider used to the authentication.
    response: Dict[str, str]
        The response of the Oauth request in json format.
    details: Dict[str, str]
        The response with user details in provider.
    user: Usuario
        Instance of the user (already registered).
    kwargs: Dict[str, bool]
        Distinct data about the execution of the pipeline.
    """
    last_name = details['last_name'] if details['last_name'] != '' else None
    if backend.name == 'facebook':
        MyUserModel(
            email=user,
            name=details['first_name'],
            last_name=last_name
        ).save()

所以关键是细节、用户甚至响应(对于其他数据)。 在 Extending the Pipeline.

中查看更多内容