Redirect User to another url with django-allauth log in signal

前端 未结 4 659
小鲜肉
小鲜肉 2020-12-30 22:34

I am using Django-allauth for my login/signup related stuff, so when a user signs up(first time) into my site, I am redirecting him to /thanks/ page by defining

相关标签:
4条回答
  • 2020-12-30 22:49

    In general, you should not try to put such logic in a signal handler. What if there are multiple handlers that want to steer in different directions?

    Instead, do this:

    # 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 讨论(0)
  • 2020-12-30 22:56

    the answer here is very simple, you do not need any signals or overriding the DefaultAccountAdapter in settings.py just add a signup redirect_url

    ACCOUNT_SIGNUP_REDIRECT_URL = "/thanks/"
    LOGIN_REDIRECT_URL = "/dashboard/"
    
    0 讨论(0)
  • 2020-12-30 23:01

    You can simply define those two other signals using user_logged_in signal as base. A good place to put it is on a signals.py inside a accounts app, in case you have one, or in you core app. Just remember to import signals.py in you __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'
    
    
    @receiver(post_user_first_login)
    def handle_post_user_first_login(sender, user, request, **kwargs):
        print 'post_user_first_login'
    
    0 讨论(0)
  • 2020-12-30 23:03

    The two datetimes last_login and date_joined will always be different, although it might only be a few milliseconds. This snippet works:

    # 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)
    

    One important remark to pennersr answer: AVOID using files named allauth.py as it will confuse Django and lead to import errors.

    0 讨论(0)
提交回复
热议问题