【问题标题】:python-social not saving response to custom modelpython-social不保存对自定义模型的响应
【发布时间】:2014-08-18 11:14:09
【问题描述】:

我在使用 django 的自定义模型方面遇到了一些问题。这一点尤其没有引发任何错误。由于某种原因,在通过 steam 进行身份验证并返回登录页面后,steamuser_user(自定义用户)和 social_auth_usersocialauth 的数据库表都是空的。没有保存任何内容,没有显示错误等。

我的自定义模型与 django docs 官方页面上的非常相似,如下所示:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser
from django.contrib.auth.models import BaseUserManager

# Create your models here.
class UserManager(BaseUserManager):
    def create_user(self, steamid, username, password=None):
        if not steamid:
            msg = 'User has no Steam ID set'
            raise ValueError(msg)
        if not username:
            msg = 'User has no name set'
            raise ValueError(msg)

        user = self.model(steamid=steamid,
                          username=username)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, steamid, username, password):
        super_user = self.create_user(steamid=steamid,
                                      username=username,
                                      password=password)
        super_user.is_staff = True
        super_user.is_admin = True
        super_user.is_mod = True
        super_user.save(using=self._db)
        return super_user


class User(AbstractBaseUser):
    steamid = models.CharField(max_length=20, unique=True)
    username = models.CharField(max_length=80)
    email = models.EmailField(null=True,blank=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)
    is_mod = models.BooleanField(default=False)
    date_joined = models.DateTimeField(auto_now_add=True)
    reputation = models.IntegerField(max_length=6, default=0)

    USERNAME_FIELD = 'steamid'

    objects = UserManager()

    def __unicode__(self):
        return self.username

    def get_full_name(self):
        return self.steamid

    def get_short_name(self):
        return self.username

我使用的设置如下:

SOCIAL_AUTH_USER_MODEL = 'steamuser.User'

AUTH_USER_MODEL = 'steamuser.User'

TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
                                                                            'social.apps.django_app.context_processors.backends',
                                                                            'social.apps.django_app.context_processors.login_redirect',
                                                                            )

AUTHENTICATION_BACKENDS = (
                           'social.backends.steam.SteamOpenId',
                           'django.contrib.auth.backends.ModelBackend',
                           )
#Steam OpenAuth
SOCIAL_AUTH_STEAM_API_KEY = 'B1D7C629D093D4B72577F2F11DE4EBE2'
LOGIN_URL = '/'
SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/'
SOCIAL_AUTH_ENABLED_BACKENDS = (
                                'steam',
                                )

任何帮助将不胜感激!

编辑

后端 steam.py

    def get_user_details(self, response):
    player = self.get_json(USER_INFO, params={
        'key': self.setting('API_KEY'),
        'steamids': self._user_id(response)
    })
    if len(player['response']['players']) > 0:
        player = player['response']['players'][0]
        details = {'steamid': player.get('steamid'),
                   'username': player.get('personaname'),
                   }
    else:
        details = {}
    return details

编辑 2

好吧,尽管我的逻辑推理,我只是放弃并创建了一个自定义管道来创建新的蒸汽用户,如下所示:

from django.contrib.auth import get_user_model

def create_steamuser(details, user=None, *args, **kwargs):
    if user:
        return {'is_new': False}

    if not details:
        return

    try:
        steam_user = get_user_model().objects.get(steamid=details['steamid'])
    except steam_user.DoesNotExist:
        get_user_model().objects.create_user(details['steamid'], details['username'])

    return {
        'is_new': True,
    }

现在我仍然遇到未创建 social_user 的问题。我已将社交用户模型设置为使用我的新自定义模型,但一定有一些我遗漏的东西。

【问题讨论】:

    标签: django python-social-auth


    【解决方案1】:

    python-social-auth 将无法将 steamiddate_joined 参数传递给管理器中的自定义 create_user() 方法。为此,您有以下三种选择:

    1. =None 设置为这些参数并为它们设置一些默认值
    2. 覆盖默认的create_user pipeline 并传递额外的参数。
    3. create_user之前添加一个自定义管道函数,并用steamiddate_joined填充details,然后定义SOCIAL_AUTH_STEAM_USER_FIELDS = ('username', 'email', 'steamid', 'date_joined')

    【讨论】:

    • 感谢您的回复,不过我有几个问题:
    • 1.为什么 social_auth_usersocialauth 表也没有被填充?它不应该仍然记录新用户吗? 2. 我已经编辑了后端 'steam.py' 文件(我在上面包含它)以包含 steamid 和用户名,这些键/值不应该在当前的 create_user 管道中使用,例如完成你的第 3 步吗?
    • 1. social_auth_usersocialauth 未填充,因为没有指向链接的 User 引用。 2. 你也定义了SOCIAL_AUTH_STEAM_USER_FIELDS
    • 嗨,对不起,我有点迷路了。我设置了'SOCIAL_AUTH_USER_MODEL ='steamuser.User''。这是否意味着 python-social 现在正在使用我的自定义用户,即 Q1?其次,我在上面的 3 个字段中定义了“SOCIAL_AUTH_STEAM_USER_FIELDS”,并且没有保存任何内容。
    • 我设法弄明白了。我需要做的就是创建一个自定义的 get_username 管道,它返回 steamid 而不是普通的用户名,因为我的自定义表使用它作为它的用户名字段。
    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多