【问题标题】:Pass data from the pipeline to views in Django Python Social Auth将数据从管道传递到 Django Python Social Auth 中的视图
【发布时间】:2023-02-07 03:51:42
【问题描述】:

我正在阅读 Python Social Auth 的文档,并对 Interrupting the Pipeline (and communicating with views) 的部分感到好奇。

在那里,我们看到以下管道代码

In our pipeline code, we would have:

from django.shortcuts import redirect
from django.contrib.auth.models import User
from social_core.pipeline.partial import partial

# partial says "we may interrupt, but we will come back here again"
@partial
def collect_password(strategy, backend, request, details, *args, **kwargs):
    # session 'local_password' is set by the pipeline infrastructure
    # because it exists in FIELDS_STORED_IN_SESSION
    local_password = strategy.session_get('local_password', None)
    if not local_password:
        # if we return something besides a dict or None, then that is
        # returned to the user -- in this case we will redirect to a
        # view that can be used to get a password
        return redirect("myapp.views.collect_password")

    # grab the user object from the database (remember that they may
    # not be logged in yet) and set their password.  (Assumes that the
    # email address was captured in an earlier step.)
    user = User.objects.get(email=kwargs['email'])
    user.set_password(local_password)
    user.save()

    # continue the pipeline
    return

和以下视图

def get_user_password(request):
    if request.method == 'POST':
        form = PasswordForm(request.POST)
        if form.is_valid():
            # because of FIELDS_STORED_IN_SESSION, this will get copied
            # to the request dictionary when the pipeline is resumed
            request.session['local_password'] = form.cleaned_data['secret_word']

            # once we have the password stashed in the session, we can
            # tell the pipeline to resume by using the "complete" endpoint
            return redirect(reverse('social:complete', args=("backend_name,")))
    else:
        form = PasswordForm()

    return render(request, "password_form.html")

对线特别感兴趣

return redirect(reverse('social:complete', args=("backend_name,")))

用于使用已建立的后端将用户重定向回管道。

我们可以看到 earlier in that page 一个用于检查正在使用哪个后端的条件。

def my_custom_step(strategy, backend, request, details, *args, **kwargs):
    if backend.name != 'my_custom_backend':
        return
    # otherwise, do the special steps for your custom backend

问题是,不是手动将它添加到 args=("backend_name,") 中,管道如何将正确的后端传递给视图?

【问题讨论】:

    标签: python django authentication django-views python-social-auth


    【解决方案1】:

    可以简单地在管道中添加

    request.session['backend'] = backend.name
    

    然后视图变成

    backend_name = request.session['backend']
    return redirect(reverse('social:complete', args=(backend_name)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多