Django Allauth在Facebook社交注册后非常具体的重定向

时间:2018-04-12 15:28:11

标签: django facebook django-allauth

我知道这个话题已经有几个问题,但我试图实现这些解决方案,但无法真正解决我的问题。

我说的是allauth的社交注册,特别是facebook。

渴望的行为:在facebook注册后,我希望用户转到我的网址“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'。事实上,方法get_connect_redirect_url永远不会被触发,因为我从未在控制台上读过“OK22OK”。 用户已创建,我最终在主页上,这不是我想要的。

所以我认为在save_user方法之后会调用其他东西,因为我可以告诉我通过帐户:欢迎,但最终在主页上。 我可以告诉你,因为如果我在save_user方法中返回了一个不正确的url,我会收到一条特定于该行上该url的错误。

那么,这里有什么问题? 我想我可能会覆盖错误的方法,但我已经阅读了基础SocialAccountAdapter的所有代码,我看不到任何其他可能是正确的选择。

只是想提一下,因为我对普通帐户注册(非社交)有更多控制权,所以我已经实现了我想要的目标。 有什么想法吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

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

方法一

Django 没有使用 DefaultSocialAccountAdapter 的重定向函数,你必须重写 DefaultAccountAdapter 的 get_signup_redirect_url 函数才能达到结果。

首先你需要改变settings.py中的默认适配器:

ACCOUNT_ADAPTER = 'users.adapter.MyAccountAdapter'

然后,只需使用您的网址覆盖 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 参数)优先于此处返回的值。

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

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

当然,您可以根据需要个性化下一个网址(我指的是 /success/url/)。您可以使用所需的 url 传递上下文变量并将其放在那里而不是硬编码的 url。