1

初めて social_auth (omab) を使用しようとしていますが、基本的な facebook ユーザーデータを保存する方法の実例がないことがわかりました。social_auth docs で説明されているように、認証は機能し、ユーザーは問題なく作成されますが、保存する必要がgenderありlocaleます。どちらも基本的な Facebook ユーザー データに属しているため、常に Facebook の応答に含まれています。

Django 1.4、Python2.7、および最新の social_auth を使用しています。だから私はSOCIAL_AUTH_USER_MODEL = 'myapp.UserProfile'settings.py ファイルと model.py で使用しようとしました:

#!/usr/bin/python
#-*- coding: UTF-8 -*-
from django.db import models
from django.contrib.auth.models import User
from django.db.models import signals
import datetime
from datetime import timedelta
from django.db.models.signals import post_save
from social_auth.signals import pre_update
from social_auth.backends.facebook import FacebookBackend


class CustomUserManager(models.Manager):
    def create_user(self, username, email):
        return self.model._default_manager.create(username=username)

class UserProfile(models.Model):
    gender = models.CharField(max_length=150, blank=True)
    locale = models.CharField(max_length=150, blank=True)
    #social_auth requirements
    username   = models.CharField(max_length=150)
    last_login = models.DateTimeField(blank=True)
    is_active  = models.BooleanField()

    objects = CustomUserManager()

    class Meta:
        verbose_name_plural = 'Profiles'

    def __unicode__(self):
        return self.username

    def get_absolute_url(self):
        return '/profiles/%s/' % self.id

    def facebook_extra_values(sender, user,response, details, **kwargs):     
        profile = user.get_profile()
        current_user = user 
        profile, new = UserProfile.objects.get_or_create(user=current_user)

        profile.gender = response.get('gender')
        profile.locale = response.get('locale')
        profile.save()
        return True

    pre_update.connect(facebook_extra_values, sender=FacebookBackend, weak = False, dispatch_uid = 'facebook_extra_values_user')

settings.py でパイプラインを定義しています

SOCIAL_AUTH_PIPELINE = (
    'social_auth.backends.pipeline.social.social_auth_user',
    #'social_auth.backends.pipeline.associate.associate_by_email',
    'social_auth.backends.pipeline.user.create_user',
    'social_auth.backends.pipeline.social.associate_user',
    'social_auth.backends.pipeline.social.load_extra_data',
    'social_auth.backends.pipeline.user.update_user_details',
    'social_auth.backends.pipeline.misc.save_status_to_session',
)

しかし、上記ではエラーが発生しますAssertionError: ForeignKey(None) is invalid. First parameter to ForeignKey must be either a model, a model name, or the string 'self'

またAUTH_PROFILE_MODULE = 'myapp.UserProfile'、以前と同じように user.model を拡張する代わりに使用しようとしましたが、これはうまく機能しますが、UserProfile の作成時に必要なデータを入力する方法がわかりません。誰でもこの問題の作業コードを配置できますか?

ありがとう

4

1 に答える 1

2

それをアーカイブするにはいくつかの方法があります。プロジェクトにより適した方法はもちろんあなた次第です。利用可能なオプションのリストは次のとおりです。

  1. この設定を定義すると、インスタンスFACEBOOK_EXTRA_DATA = ('gender', 'locale')で値が使用可能になり、またはを実行するだけで値を取得できます。これは、基本的なユーザー データ応答で情報が利用できるという理由だけで可能です。UserSocialAuthuser.social_auth.get(provider='facebook').extra_data['gender']['locale']

  2. ユーザープロファイルを使用してこのデータを保存します (これについてはdjango docを確認してください)。次に、値をプロファイル インスタンスに格納するパイプライン エントリを追加するだけです。

  3. カスタム ユーザー モデルを作成SOCIAL_AUTH_USER_MODEL = 'myapp.CustomUser'し、ユーザー インスタンスに値を格納するカスタム パイプライン エントリを再度追加します。

ユーザーは複数の Facebook アカウントを接続することができ、混乱を招く可能性があるため、1 番は最善の解決策ではありません。番号 2 は Django 1.4 以下に適していますが、Django 1.5 以降では非推奨になっているため、考慮に入れる必要があります。番号 3 は少し面倒な IMO です。

于 2012-10-17T15:06:31.180 に答える