нехешируемый тип при перенаправлении обратно на сайт с использованием python-social-auth в Django

Я пытаюсь добавить на веб-сайт аутентификацию через социальные сети с помощью Social-auth-app-django .

Поэтому я создал различные приложения для самых популярных веб-сайтов социальных сетей (Facebook, Twitter, Google+) и установил там URL-адрес обратного вызова.

Но я сталкиваюсь с ошибкой, когда меня перенаправляют обратно на сайт, скажем, из Facebook:

    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'

Ниже приводится сводка того, как я настроил social_django:

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

После этого я, очевидно, перенес базу данных для создания новых таблиц.

Ниже приведены версии Django и social_django:

  • Django: 1.10.5
  • social_django: 1.2.0

Что касается используемого конвейера, я использую django-pipeline, но он предназначен только для компиляции SASS файлов в CSS.

Что может вызвать эту ошибку?


person Hakim    schedule 28.07.2017    source источник
comment
slice имеет изменяемый тип (например, список). Поэтому, если вы пытаетесь использовать это в ключе словаря, вы получите ошибку типа unhashable type   -  person Alex S    schedule 28.07.2017
comment
Вам нужно показать свой код или, по крайней мере, то, как вы настроили python-social-auth.   -  person Daniel Roseman    schedule 28.07.2017
comment
Пожалуйста, опубликуйте более подробную информацию, например версию Django, версию python-social-auth, полную трассировку, пользовательские конфигурации, такие как пользовательский конвейер и т. д.   -  person omab    schedule 28.07.2017
comment
Я только что обновил вопрос. Дайте мне знать, если есть еще какие-то детали, которые нужно добавить.   -  person Hakim    schedule 29.07.2017
comment
Вы видите, что чего-то не хватает в конфигурации python-social-auth?   -  person Hakim    schedule 02.08.2017
comment
Вы определили конвейер в settings.py?   -  person Kaushal    schedule 06.08.2017
comment
Не путайте с django-pipeline. Python Social Auth имеет собственный конвейер.   -  person Kaushal    schedule 06.08.2017
comment
@Kaushal Я не определил ничего другого в settings.py, кроме того, что уже фигурирует в вопросе. Единственный определенный конвейер предназначен для django-pipeline, отвечает ли он за ошибку (т.е. выбирает ли он неправильный конвейер... Я только что добавил свой конвейер к вопросу)?   -  person Hakim    schedule 06.08.2017


Ответы (2)


Добавление конвейера ниже в settings.py, похоже, устранило проблему (источник):

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',
)
person Hakim    schedule 06.08.2017

Эта ошибка возникает при попытке получить фрагмент из объекта dict. Итак, да, в точке последней строки трассировки pipelines является объектом dict, хотя предполагается, что это последовательность, значение по умолчанию которой равно sociel_core.pipeline.DEFAULT_AUTH_PIPELINE, если только ваши настройки не предоставляют объект 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

Таким образом, я подозреваю, что что-то, вероятно, в вашем модуле настроек, что искажает этот PIPELINE, который должен быть последовательностью (список, кортеж, пользовательский), а не dict.

Советы: установите ipython и поиграйте с python manage.py shell и проверьте следующее.

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

Надеюсь, это помогло

person glenfant    schedule 06.08.2017
comment
st.get_pipeline() выдает эту ошибку: NotImplementedError: Implement in subclass. Следует ли реализовать конвейер с помощью python-social-auth? - person Hakim; 07.08.2017