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

时间:2013-11-22 06:00:41

标签: django django-signals django-allauth

我正在使用Django-allauth作为我的登录/注册相关内容,因此当用户(第一次)注册到我的网站时,我通过在{{1}中定义以下设置将他重定向到/thanks/页面文件

LOGIN_REDIRECT_URL ='/ thanks /'

但是当用户下次尝试登录时(如果已经注册),我应该将他重定向到settings.py网址

因此尝试使用下面的'/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/' ,这是我确定用户第一次出错时的逻辑吗?

4 个答案:

答案 0 :(得分:25)

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

相反,这样做:

# 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/'

答案 1 :(得分:6)

两个日期时间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)
使用名为 allauth.py 的文件,对pennersr的一个重要评论回答:避免,因为它会混淆Django并导致 import错误

答案 2 :(得分:0)

您可以使用 user_logged_in 信号作为基础,简单地定义其他两个信号。如果您有一个核心应用,或者在核心应用中,则可以在 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'

答案 3 :(得分:0)

答案很简单,您不需要任何信号或覆盖DefaultAccountAdaptersettings.py中只需添加一个注册redirect_url

ACCOUNT_SIGNUP_REDIRECT_URL = "/thanks/"
LOGIN_REDIRECT_URL = "/dashboard/"