Django Allauth的Facebook社交登录后需要特定重定向

3

我知道这个主题已经有一些问题了,但是我尝试实现那些解决方案并不能真正解决我的问题。

我在这里谈论的是使用allauth进行社交注册,尤其是Facebook。

期望的行为:在Facebook注册后,我希望用户进入我的URL“accounts:welcome”,但是当他们简单登录时,我希望他们进入我的LOGIN_REDIRECT_URL(即站点的主页)。 在这里和那里看过之后,这是我想出的代码(编写我的自定义适配器)

settings.py:

LOGIN_REDIRECT_URL = ("gamestream:home")
SOCIALACCOUNT_ADAPTER = "myproject.users.adapter.MySocialAccountAdapter"

adapter.py:

from django.conf import settings
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter
from django.core.urlresolvers import reverse
from django.shortcuts import redirect


class MySocialAccountAdapter(DefaultSocialAccountAdapter):

    def save_user(self, request, sociallogin, form=None):
        print('OK11OK')
        super().save_user(request, sociallogin, form=form)
        return redirect(reverse('accounts:welcome'))

    def get_connect_redirect_url(self, request, socialaccount):
        print('OK22OK')
        assert is_authenticated(request.user)
        url = reverse('accounts:welcome')
        return url

请假设所有链接/设置都是正确的,例如当我通过 Facebook 应用程序创建自己的用户时,控制台会打印出“OK11OK”。事实是,由于控制台上从未读取到“OK22OK”,因此方法 get_connect_redirect_url 从未被触发。用户已创建并且我最终进入主页,这不是我想要的。
因此,我认为在 save_user 方法之后调用了其他内容,因为我可以看出我经过了 accounts:welcome,但最终进入了主页。我可以确定这一点,因为如果我在 save_user 方法中返回一个不正确的 URL,我会收到特定于该行的 URL 的错误。
那么,问题出在哪里呢? 我认为我可能覆盖了错误的方法,但我已经阅读了基本 SocialAccountAdapter 的所有代码,并没有找到其他合适的选择。
只是想提一下,由于我对普通帐户注册(非社交)有更多的控制,因此我已经实现了我想要的功能。 有什么建议吗?
非常感谢!
1个回答

0

我也遇到了同样的问题,我找到了两种方法:

方法1

Django不使用DefaultSocialAccountAdapter的重定向函数,您需要覆盖DefaultAccountAdapter的get_signup_redirect_url函数以实现结果。

首先,您需要在settings.py中更改默认适配器:

ACCOUNT_ADAPTER = 'users.adapter.MyAccountAdapter'

然后,只需使用您的URL覆盖get_signup_redirect_url:

# project/users/adapter.py
from allauth.account.adapter import DefaultAccountAdapter
 
class MyAccountAdapter(DefaultAccountAdapter):

def get_signup_redirect_url(self, request):
    return resolve_url('/your/url/')

方法二

这个方法更简单

如果你查看DefaultAccountAdapter的源代码,它会说:

返回登录后默认重定向的URL。请注意,显式传递的URL(例如通过传递next GET参数)优先于此处返回的值。

因此,您可以在登录模板中传递一个next参数来强制重定向。以下是使用Google社交登录的示例:

{% load socialaccount %}
{% providers_media_js %}
{# your html tags #}
<body>
    <a href="{% provider_login_url 'google' next='/success/url/' %}">SOCIAL LOGIN </a>
</body>

当然,您可以根据自己的需要个性化下一个URL(我指的是/success/url/)。您可以传递一个上下文变量,将您想要的URL放在那里,而不是硬编码的URL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接