首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用django-allauth登录信号将用户重定向到另一个url

使用django-allauth登录信号将用户重定向到另一个url
EN

Stack Overflow用户
提问于 2013-11-22 14:00:41
回答 4查看 14.5K关注 0票数 26

我使用Django-allauth登录/注册相关的东西,所以当一个用户注册(第一次)到我的网站时,我通过在settings.py文件中定义以下设置将他重定向到/thanks/页面

LOGIN_REDIRECT_URL =‘/谢谢/’

但是当用户下一次尝试登录(如果已经注册)时,我应该将他重定向到'/dashboard/'地址

所以我试着用Django-allauth signals来改变这一点,如下所示,它根本不起作用

@receiver(allauth.account.signals.user_logged_in)
def registered_user_login(sender, **kwargs):
    instance = User.objects.get_by_natural_key(kwargs['user'])
    print instance.last_login==instance.date_joined,"??????????????????????????????"
    if not instance.last_login==instance.date_joined:
        return HttpResponseRedirect(reverse('dashboard'))

所以谁能让我知道如何将用户重定向到/dashboard/以便正常登录,我在上面的信号代码中做错了什么吗?

编辑

在根据pennersr的以下答案进行了一些修改之后,我的AccountAdapter类如下所示

from allauth.account.adapter import DefaultAccountAdapter
# from django.contrib.auth.models import User

class AccountAdapter(DefaultAccountAdapter):

  def get_login_redirect_url(self, request):
    if request.user.last_login == request.user.date_joined:
        return '/registration/success/'
    else:
        return '/dashboard/'

但是,它仍然将用户重定向到/dashboard/,这是我确定第一次用户错误的逻辑吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-22 19:14:10

通常,您不应尝试将此类逻辑放入信号处理程序中。如果有多个处理程序想要控制不同的方向,该怎么办?

相反,请执行以下操作:

# settings.py:
ACCOUNT_ADAPTER = 'project.users.allauth.AccountAdapter'


# project/users/allauth.py:
class AccountAdapter(DefaultAccountAdapter):

  def get_login_redirect_url(self, request):
      return '/some/url/'
票数 28
EN

Stack Overflow用户

发布于 2014-02-27 15:54:16

两个日期时间last_logindate_joined将始终不同,尽管它可能只有几毫秒。下面的代码片段可以工作:

# settings.py:
ACCOUNT_ADAPTER = 'yourapp.adapter.AccountAdapter'

# yourapp/adapter.py:
from allauth.account.adapter import DefaultAccountAdapter
from django.conf import settings
from django.shortcuts import resolve_url
from datetime import datetime, timedelta

class AccountAdapter(DefaultAccountAdapter):

    def get_login_redirect_url(self, request):
        threshold = 90 #seconds

        assert request.user.is_authenticated()
        if (request.user.last_login - request.user.date_joined).seconds < threshold:
            url = '/registration/success'
        else:
            url = settings.LOGIN_REDIRECT_URL
        return resolve_url(url)

的一个重要注释 to pennersr答案:避免使用名为allauth.py的文件,因为它会混淆Django并导致导入错误

票数 9
EN

Stack Overflow用户

发布于 2016-12-14 21:18:23

您可以简单地使用user_logged_in signal作为基础来定义这两个其他信号。一个很好的地方是把它放在accounts应用程序内部的signals.py上,或者放在你的核心应用程序中。只需记住在您的__init__.py.中导入signals.py

from django.dispatch import receiver, Signal

pre_user_first_login = Signal(providing_args=['request', 'user'])
post_user_first_login = Signal(providing_args=['request', 'user'])


@receiver(user_logged_in)
def handle_user_login(sender, user, request, **kwargs):
    first_login = user.last_login is None
    if first_login:
        pre_user_first_login.send(sender, user=user, request=request)
    print 'user_logged_in'
    if first_login:
        post_user_first_login.send(sender, user=user, request=request)


@receiver(pre_user_first_login)
def handle_pre_user_first_login(sender, user, request, **kwargs):
    print 'pre_user_first_login'


@receiver(post_user_first_login)
def handle_post_user_first_login(sender, user, request, **kwargs):
    print 'post_user_first_login'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20138049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档