2017-07-28 3 views
9

J'essaie d'ajouter une authentification de médias sociaux à un site Web en utilisant Social-auth-app-django. J'ai donc créé différentes applications pour les sites Web de médias sociaux les plus populaires (Facebook, Twitter, Google+), et j'ai défini l'URL de rappel ici.lors de la redirection vers le site Web en utilisant python-social-auth dans Django

Mais je viens sur une erreur quand je suis redirigé sur le site de Facebook dire:

Internal Server Error: /oauth/complete/facebook/ 
Traceback (most recent call last): 
    File "/usr/local/lib/python3.5/site-packages/django/core/handlers/exception.py", line 39, in inner 
    response = get_response(request) 
    File "/usr/local/lib/python3.5/site-packages/django/core/handlers/base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "/usr/local/lib/python3.5/site-packages/django/core/handlers/base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/usr/local/lib/python3.5/site-packages/django/views/decorators/cache.py", line 57, in _wrapped_view_func 
    response = view_func(request, *args, **kwargs) 
    File "/usr/local/lib/python3.5/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view 
    return view_func(*args, **kwargs) 
    File "/usr/local/lib/python3.5/site-packages/social_django/utils.py", line 50, in wrapper 
    return func(request, backend, *args, **kwargs) 
    File "/usr/local/lib/python3.5/site-packages/social_django/views.py", line 32, in complete 
    redirect_name=REDIRECT_FIELD_NAME, *args, **kwargs) 
    File "/usr/local/lib/python3.5/site-packages/social_core/actions.py", line 41, in do_complete 
    user = backend.complete(user=user, *args, **kwargs) 
    File "/usr/local/lib/python3.5/site-packages/social_core/backends/base.py", line 40, in complete 
    return self.auth_complete(*args, **kwargs) 
    File "/usr/local/lib/python3.5/site-packages/social_core/utils.py", line 252, in wrapper 
    return func(*args, **kwargs) 
    File "/usr/local/lib/python3.5/site-packages/social_core/backends/facebook.py", line 110, in auth_complete 
    return self.do_auth(access_token, response, *args, **kwargs) 
    File "/usr/local/lib/python3.5/site-packages/social_core/backends/facebook.py", line 152, in do_auth 
    return self.strategy.authenticate(*args, **kwargs) 
    File "/usr/local/lib/python3.5/site-packages/social_django/strategy.py", line 115, in authenticate 
    return authenticate(*args, **kwargs) 
    File "/usr/local/lib/python3.5/site-packages/django/contrib/auth/__init__.py", line 74, in authenticate 
    user = backend.authenticate(**credentials) 
    File "/usr/local/lib/python3.5/site-packages/social_core/backends/base.py", line 80, in authenticate 
    return self.pipeline(pipeline, *args, **kwargs) 
    File "/usr/local/lib/python3.5/site-packages/social_core/backends/base.py", line 83, in pipeline 
    out = self.run_pipeline(pipeline, pipeline_index, *args, **kwargs) 
    File "/usr/local/lib/python3.5/site-packages/social_core/backends/base.py", line 105, in run_pipeline 
    for idx, name in enumerate(pipeline[pipeline_index:]): 
TypeError: unhashable type: 'slice' 

Voici un résumé de la façon dont j'ai configuré social_django:

En settings.py:

INSTALLED_APPS = [ 
    'social_django', 
    ... 
] 

AUTHENTICATION_BACKENDS = (
    'social_core.backends.google.GoogleOAuth2', 
    'social_core.backends.twitter.TwitterOAuth', 
    'social_core.backends.facebook.FacebookOAuth2', 

    'django.contrib.auth.backends.ModelBackend', 
) 

SOCIAL_AUTH_FACEBOOK_KEY = 'xxx' 
SOCIAL_AUTH_FACEBOOK_SECRET = 'xxx' 

... 

PIPELINE = { 
    'PIPELINE_ENABLED': True, 
    'STYLESHEETS': {...}, 
    'JAVASCRIPT': {...}, 
    'JS_COMPRESSOR': 'pipeline.compressors.NoopCompressor', 
    'COMPILERS': (
     'pipeline.compilers.sass.SASSCompiler', 
    ) 
} 

Ensuite, je l'ai évidemment migré la base de données c reate les nouvelles tables.

S'il vous plaît trouverez ci-dessous les versions de Django et social_django:

  • Django: 1.10.5
  • social_django: 1.2.0

En ce qui concerne le pipeline utilisé, j'utilise django-pipeline mais c'est juste pour compiler SASS fichiers à CSS.

Ce qui pourrait causer cette erreur?

+0

est d'un type mutable (par exemple une liste). Donc, si vous essayez d'utiliser cela dans la clé d'un dictionnaire, alors vous obtiendrez l'erreur de type indisponible –

+0

Vous devez montrer votre code, ou au moins la façon dont vous avez configuré python-social-auth. –

+0

Veuillez publier plus de détails comme la version de Django, la version python-social-auth, le retraçage complet, les configurations personnalisées comme le pipeline personnalisé, etc. – omab

Répondre

3

Ajout du pipeline ci-dessous pour settings.py semble avoir résolu le problème (source):

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.user.create_user', 
    'social_core.pipeline.social_auth.associate_user', 
    'social_core.pipeline.social_auth.load_extra_data', 
    'social_core.pipeline.user.user_details', 
    'social_core.pipeline.social_auth.associate_by_email', 
) 
tranche
1

Cette erreur survient lors de la tentative d'obtention d'une tranche à partir d'un objet dict. Donc, oui au point de la dernière ligne de la traceback, pipelines est un objet dict quand il est supposé être une séquence dont la valeur par défaut est sociel_core.pipeline.DEFAULT_AUTH_PIPELINE sauf si vos paramètres fournissent un objet PIPELINE.

https://github.com/python-social-auth/social-core/blob/ccc50a5932b199a1a5209a08563c8997eb99391d/social_core/strategy.py#L99

https://github.com/python-social-auth/social-core/blob/ccc50a5932b199a1a5209a08563c8997eb99391d/social_core/pipeline/init.py#L1

Ainsi, je soupçonne que quelque chose probablement dans votre module de paramètres qui salit ce PIPELINE qui devrait être une séquence (liste, tuple, personnalisé) et non un dict.

Astuces: installez ipython et jouez avec python manage.py shell et inspectez les éléments suivants.

>>> from social_core.strategy import BaseStrategy 
>>> st = BaseStrategy() 
>>> st.get_pipeline() 
---> ??? 
>>> from django.conf import settings 
>>> settings.PIPELINE 
---> ??? 

Hope this aidé

+0

'st.get_pipeline()' renvoie cette erreur: 'NotImplementedError: implémente la sous-classe'. Un pipeline devrait-il être implémenté avec python-social-auth? – h4k1m