2013-11-22 76 views
19

我为我的登录/注册相关内容使用Django-allauth,所以当用户注册(第一次)到我的网站时,我将他重定向到/thanks/页面在settings.py文件中定义如下设置用django-allauth登录信号将用户重定向到另一个网址

LOGIN_REDIRECT_URL =“/谢谢/”

但是,当用户试图登录,在未来的时间(如果已经注册),我要他重定向到'/dashboard/' URL

所以试图改变Django-allauth signals像下面这是不workin处的G所有

@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/,我的逻辑在确定第一次用户错了?

回答

19

一般来说,你不应该试图把这样的逻辑放在信号处理程序中。如果有多个处理程序想要转向不同的方向怎么办?

相反,这样做:

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

谢谢pennersr,我上面编辑过我的anser,你能帮我解决吗? –

+0

我们也可以为用户提供重新发送确认电子邮件的选项吗?如果他没有确认登记? –

+0

您是否尝试过检查last_login/date_joined的值?只要用户尝试使用未经验证的电子邮件登录,就会自动重新发送确认电子邮件。请注意,为了防止邮件轰炸,只有当登录尝试间隔3分钟左右时才会进行。 – pennersr

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) 

一个重要提示到pennersr答案:AVOID使用的文件名为allauth.py,因为它会混淆Django和导致导入错误

+0

谢谢,这是有帮助的 –

+0

@ user2292376我认为'assert'在这里是不必要的,因为这是一个登录重定向,所以用户应该在被调用的地方进行身份验证。然而,+1 – Caumons

+0

@ DH​​1TW我相信这个解决方案并不完全是防弹的......我只是意识到,如果用户尝试登录失败(密码错误),request.user.last_login仍会因某种原因而更新,因此请求。 user.last_login!= request.user.date_joined,甚至没有门槛可以保存它..你们有解决方案吗? – psychok7

0

您可以简单地使用user_logged_in信号作为基准来定义这两个其他信号。一个好地方,就是signals.py里面的一个帐户应用程序,如果你有一个,或在你的核心应用程序。只记得导入signals.py__init__.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' 
    pass 


@receiver(post_user_first_login) 
def handle_post_user_first_login(sender, user, request, **kwargs): 
    print 'post_user_first_login' 
    pass 
相关问题