5

認証パイプラインの最後に関数を追加したいのですが、この関数は、そのユーザーの「プロファイル」テーブルがあるかどうかを確認するためのもので、ない場合はテーブルを作成します。Profiles モデルは、ユーザーに関する追加情報を格納するテーブルです。

class Profiles(models.Model):
    user = models.OneToOneField(User, unique=True, null=True)
    description = models.CharField(max_length=250, blank=True, null=True)
    points = models.SmallIntegerField(default=0)
    posts_number = models.SmallIntegerField(default=0)

各ユーザーにはプロファイル テーブルが必要です。そこで、パイプラインの最後に関数を追加しました。

SOCIAL_AUTH_PIPELINE = (
    'social.pipeline.social_auth.social_details',
    'social.pipeline.social_auth.social_uid',
    'social.pipeline.social_auth.auth_allowed',
    'social.pipeline.social_auth.social_user',
    'social.pipeline.user.get_username',
    'social.pipeline.user.create_user',
    'social.pipeline.social_auth.associate_user',
    'social.pipeline.social_auth.load_extra_data',
    'social.pipeline.user.user_details',
    'app.utils.create_profile'  #Custom pipeline
)

#utils.py 
def create_profile(strategy, details, response, user, *args, **kwargs):
    username = kwargs['details']['username']
    user_object = User.objects.get(username=username)
    if Profiles.ojects.filter(user=user_object).exists():
        pass
    else:
        new_profile = Profiles(user=user_object)
        new_profile.save()
    return kwargs

エラーが発生します:

 KeyError at /complete/facebook/
 'details'
 ...
 utils.py in create_profile
 username = kwargs['details']['username']

私はpythonソーシャル認証を初めて使用していますが、明らかな何かが欠けているようです。どんな助けでも大歓迎です。

4

1 に答える 1

5

わかりましたので、将来誰かに役立つ場合に備えて、自分の質問に答えます。私は専門家ではありませんが、ここにあります:

私はこのチュートリアルに従っていました。

 email = kwargs['details']['email']

できると思った

username = kwargs['details']['username']

しかし、それはうまくいきませんでした.KeyErrorが発生しました.

それから私は試しました:

username = details['username']

そしてそれはうまくいきました。しかし、新しい問題がありました。詳細辞書のユーザー名は u'Firstname Lastname' のようなもので、User オブジェクトを取得しようとしたときに

user_object = User.objects.get(username=username)

User モデルのユーザー名が u'FirstnameLastname' (スペースなし) だったため、見つかりませんでした。

最後にドキュメントをもう一度読んだところ、ユーザーオブジェクトを直接使用できることがわかりました。ユーザーオブジェクトは「ユーザー」として関数に渡されます。

def create_profile(strategy, details, response, user, *args, **kwargs):

    if Profiles.objects.filter(usuario=user).exists():
        pass
    else:
        new_profile = Profiles(user=user)
        new_profile.save()

    return kwargs
于 2014-07-28T18:41:01.423 に答える