python-social不保存对自定义模型的响应

时间:2014-08-11 10:00:32

标签: django python-social-auth

我在使用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

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

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的问题。我已经将社交用户模型设置为使用我的新自定义模型,但必须有一些我缺少的东西。

1 个答案:

答案 0 :(得分:0)

python-social-auth将无法将steamiddate_joined参数传递给经理中的自定义create_user()方法。为了实现这一目标,您有三种选择:

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