Частичный конвейер python-social-auth не может возобновиться

Я пытаюсь собрать пароль для нового пользователя с частичным конвейером python-social-auth. По какой-то неизвестной причине я не могу возобновить конвейер, страница отображается на странице сбора паролей после отправки формы.

Что связано с тем, что даже когда я набрал http.../complete/backend-name, страница будет перенаправлена ​​обратно на страницу сбора паролей. Похоже, что рендеринг идет в бесконечном цикле: сначала страница сбора пароля указывает на полную страницу, а вся страница сразу возвращается на страницу сбора пароля. Я проверил значение для REDIRECT_FIELD_NAME, оно "следующее".

Я не уверен, что не так с моим кодом, любые советы / предложения очень ценятся.

settings.py

SOCIAL_AUTH_PIPELINE = (
    ...
    'accounts.pipeline.get_password',
    ...
)

pipeline.py

from django.shortcuts import redirect
from social.pipeline.partial import partial

@partial
def get_password(strategy, details, user=None, is_new=False, *args, **kwargs):
    if is_new:
        return redirect('accounts_signup_social')
    else:
        return

views.py

def get_password(request):
    if request.method == 'POST':
        request.session['password'] = request.POST.get('password')
        backend = request.session['partial_pipeline']['backend']
        return redirect('social:complete', backend=backend)
    return render_to_response('accounts/social_signup.html',{"form":SocialSignUpForm}, RequestContext(request))

1 ответ

Хорошо. Я нашел проблему и решение.

Как сказано в документации: "Трубопровод возобновит работу с той же функцией, что и процесс". по адресу http://python-social-auth.readthedocs.org/en/latest/pipeline.html. Это означает, что он всегда будет возвращаться к одной и той же функции.

Решение состоит в том, чтобы добавить проверку сеанса для пароля в конвейере. Вернитесь к следующему конвейеру, если пароль заархивирован:

трубопровод:

from django.shortcuts import redirect
from social.pipeline.partial import partial

@partial
def get_password(strategy, details, user=None, is_new=False, *args, **kwargs):
    if is_new:
        if 'password' in kwargs['request'].session:
            return {'password': kwargs['request'].session['psssword']}
        else:
            return redirect('accounts_signup_social')
    else:
        return
Другие вопросы по тегам