Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用django allauth登录信号将用户重定向到另一个url_Django_Django Signals_Django Allauth - Fatal编程技术网

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

使用django allauth登录信号将用户重定向到另一个url,django,django-signals,django-allauth,Django,Django Signals,Django Allauth,我正在使用Django allauth进行我的登录/注册相关的东西,因此当用户(第一次)注册到我的网站时,我通过在settings.py文件中定义以下设置,将其重定向到/thanky/页面 登录\u重定向\u URL='/Thank/' 但是当用户下次尝试登录时(如果已经注册),我应该将他重定向到'/dashboard/'URL 所以我试着用下面这种根本不起作用的Django allauth信号来改变这一点 @receiver(allauth.account.signals.user_logge

我正在使用Django allauth进行我的登录/注册相关的东西,因此当用户(第一次)注册到我的网站时,我通过在
settings.py
文件中定义以下设置,将其重定向到
/thanky/
页面

登录\u重定向\u URL='/Thank/'

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

所以我试着用下面这种根本不起作用的Django allauth信号来改变这一点

@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/
,这是我判断第一次用户错误的逻辑?

一般来说,您不应该尝试将此类逻辑放入信号处理程序中。如果有多个操纵器想要转向不同的方向,该怎么办

相反,请执行以下操作:

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

最后一次登录的日期时间和加入的日期时间总是不同的,尽管可能只有几毫秒。此代码段适用于:

# 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)
#settings.py:
ACCOUNT\u ADAPTER='yourapp.ADAPTER.AccountAdapter'
#yourapp/adapter.py:
从allauth.account.adapter导入DefaultAccountAdapter
从django.conf导入设置
从django.shortcuts导入解析url
从datetime导入datetime,timedelta
类AccountAdapter(DefaultAccountAdapter):
def get_login_redirect_url(自我,请求):
阈值=90秒
断言请求。用户。是否经过身份验证()
if(request.user.last_login-request.user.date_加入)。秒<阈值:
url=“/注册/成功”
其他:
url=settings.LOGIN\u REDIRECT\u url
返回解析url(url)

对pennersr回答:避免使用名为allauth.py的文件,因为这会混淆Django并导致导入错误

您可以使用用户登录信号作为基础来定义这两个其他信号。如果你有一个账户应用程序,或者在你的核心应用程序中,一个放置它的好地方是signals.py。只需记住在您的\uuu init\uuu.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'

这里的答案很简单,您不需要任何信号或覆盖
DefaultAccountAdapter
settings.py
中,只需添加一个注册重定向\u url即可

ACCOUNT\u SIGNUP\u REDIRECT\u URL=“/thank/”
登录\u重定向\u URL=“/dashboard/”

谢谢pennersr,我已经编辑了上面的回复,你能帮我一下吗?我们还能为用户提供重新发送确认电子邮件的选项吗?如果未确认他何时注册?您是否尝试检查上次登录/加入日期的值?一旦用户尝试使用未经验证的电子邮件登录,就会自动重新发送确认电子邮件。请注意,为了防止邮件轰炸,这仅在登录尝试间隔3分钟左右时生效。请不要将新文件命名为“project/../allauth.py”,它将首先加载到您的路径中,并屏蔽整个allauth库,从而引发导入恐怖。@pennersr您是否介意帮助我解决此处列出的问题谢谢,那是helpful@user2292376我认为这里没有必要使用
断言
,因为这是一个登录重定向,所以用户应该在调用时进行身份验证。但是,+1@DH1TW我相信这个解决方案不完全是防弹的。。。我刚刚意识到,如果用户尝试登录失败(密码错误),由于某种原因,request.user.last_login仍会更新,因此request.user.last_login!=request.user.date_已加入,甚至阈值都无法保存它。。你们有解决办法吗?