我使用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/
,这是我确定第一次用户错误的逻辑吗?
发布于 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/'
发布于 2014-02-27 15:54:16
两个日期时间last_login
和date_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并导致导入错误。
发布于 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'
https://stackoverflow.com/questions/20138049
复制相似问题