【问题标题】:django-allauth adapter redirectsdjango-allauth 适配器重定向
【发布时间】:2014-06-09 08:10:29
【问题描述】:

我正在利用 django-allauth 为我的物业管理应用程序提供 Google 身份验证。这是我正在寻找的注册工作流程:

  1. 一位新经理进入带有“使用 Google 注册”按钮的注册页面。
  2. 他们单击按钮并登录 Google。
  3. 在 Google 的回电中,他们会收到一份表格以获取更多信息。
  4. 当他们提交此表单时,他们的用户帐户和经理配置文件被创建,他们被重定向到他们公司的主页。

我试图通过适配器处理这个“重定向到公司主页”。我遇到的问题是“get_login_redirect_url”函数是在初始谷歌登录之后执行的,但在我收集他们的工作时间表的注册表单之前,所以我在适配器重定向上得到了一个 DoesNotExist,因为它是在 managerprofile 之前调用的已创建。

进行这些重定向的正确方法是什么?

settings.py

ACCOUNT_SIGNUP_FORM_CLASS = 'managers.signup.ManagerProfileSignupForm'
SOCIALACCOUNT_AUTO_SIGNUP = False
SOCIALACCOUNT_ADAPTER = 'managers.adapter.ManagerSocialAccountAdapter'
ACCOUNT_ADAPTER = 'managers.adapter.ManagerAccountAdapter'


adapters.py

class ManagerSocialAccountAdapter(DefaultSocialAccountAdapter):
    def get_connect_redirect_url(self, request, socialaccount):
        return reverse('company_details', args=(request.user.managerprofile.company.pk,))

class ManagerAccountAdapter(DefaultAccountAdapter):
    def get_login_redirect_url(self, request):
        return reverse('company_details', args=(request.user.managerprofile.company.pk,))

【问题讨论】:

  • 您是否碰巧找到了解决方案
  • 兄弟你找到解决办法了吗

标签: django django-allauth


【解决方案1】:

您需要定义一个装饰器,该装饰器包含一个在创建帐户之前运行的函数。来看看

#imports necessary for decorator call
from allauth.exceptions import ImmediateHttpResponse
from allauth.socialaccount.signals import pre_social_login
from allauth.account.utils import perform_login
from django.dispatch import receiver
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter
from allauth.socialaccount.models import SocialLogin

# defining class to run through authentication
class SocialAccountAdapter(DefaultSocialAccountAdapter):
def pre_social_login(self, request, sociallogin):
    pass

# reciever defining function to hold the account before making it registered
@receiver(pre_social_login)
def link_to_local_user(sender, request, sociallogin, **kwargs):
    socialemail = sociallogin.user.email
    socialuname = socialemail.split('@')[0]
    sociallogin.user.username = socialuname+str(sociallogin.user.pk)

    if User.objects.filter(email=sociallogin.user.email).exists():
        user = User.objects.get(email=sociallogin.user.email)
        if user:
            perform_login(request, user, email_verification='optional')
            raise ImmediateHttpResponse(redirect('homePage'))
    else:
        SocialLogin.save(sociallogin, request, connect=False)
        user = User.objects.get(email=sociallogin.user.email)
        perform_login(request, user, email_verification='optional')
        raise ImmediateHttpResponse(redirect('homePage'))

这是假设您在创建用户模型实例时创建了一个信号,该信号直接创建了一个也映射用户的配置文件模型实例。如果没有,在 ManagerProfile 的模型下方,使用这个:

def create_profile(sender, instance, created, **kwargs):
    if created:
        <ManagerProfileModel>.objects.create(userID=instance)

 post_save.connect(create_profile, sender=<UserModelWhereMainAccountIsCreated>)

【讨论】:

    【解决方案2】:

    在应用程序的 settings.py 中设置 LOGIN_REDIRECT_URL:

    我有这个值,重定向到主页:

    LOGIN_REDIRECT_URL = '/'
    

    【讨论】:

    • 我在使用 LOGIN_REDIRECT_URL 设置时遇到的问题是我无法动态设置此值。根据用户的不同,我可能会将它们重定向到 /companies/1 或 /companies/2。我假设您必须实现一个适配器才能获得此动态重定向。
    猜你喜欢
    • 2021-11-03
    • 1970-01-01
    • 2022-10-14
    • 2015-01-13
    • 2014-05-06
    • 1970-01-01
    • 2015-10-01
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多