2017-07-28 17 views
9

Próbuję dodać uwierzytelnianie w mediach społecznościowych do witryny za pomocą Social-auth-app-django.Nieodłączalny typ podczas przekierowywania z powrotem do witryny przy użyciu Pythona-social-auth w Django

Stworzyłem więc różne aplikacje dla najpopularniejszych serwisów społecznościowych (Facebook, Twitter, Google+) i ustawiłem tam URL wywołania zwrotnego.

Ale ja napotykając błędu, kiedy jestem z powrotem przekierowany do strony z Facebook powiedzieć:

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' 

Poniżej znajduje się podsumowanie jak mam skonfigurowany social_django:

W 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', 
    ) 
} 

potem, mam oczywiście migracji bazy danych do c powracaj do nowych tabel.

Poniżej znajduje wersjach Django i social_django:

  • Django: 1.10.5
  • social_django: 1.2.0

chodzi o rurociąg używany, używam django-pipeline ale służy tylko do kompilowania plików SASS do CSS.

Co może powodować ten błąd?

+0

plaster jest typu zmienny (takie jak listy). Jeśli więc spróbujesz użyć tego w kluczu słownika, dostaniesz nieusuwalny błąd typu –

+0

Musisz pokazać swój kod, lub przynajmniej tak, jak skonfigurowałeś python-social-auth. –

+0

Proszę napisać więcej szczegółów, takich jak wersja Django, wersja python-social-auth, pełny traceback, niestandardowe konfiguracje, takie jak niestandardowy potok, itp. – omab

Odpowiedz

3

Dodawanie rurociąg poniżej settings.py Wydaje się, że problem został rozwiązany (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', 
) 
1

Błąd ten powstaje podczas próby pobrania plastra z obiektu dyktującego. Tak, tak w punkcie ostatniej linii śledzenia, pipelines jest obiektem dict, gdy ma być sekwencją, której domyślną wartością jest sociel_core.pipeline.DEFAULT_AUTH_PIPELINE, chyba że twoje ustawienia zapewniają obiekt 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

Dlatego podejrzewam coś prawdopodobnie w module Ustawienia, które mes ten rurociąg, który powinien być sekwencją (lista, krotka, niestandardowe), a nie dict.

Wskazówki: zainstaluj ipython i graj z python manage.py shell i sprawdź, co następuje.

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

Nadzieja to pomogło

+0

'st.get_pipeline()' wyrzuca ten błąd: 'NotImplementedError: Implement in subclass'. Czy powinien zostać wdrożony potok z python-social-auth? – h4k1m

Powiązane problemy