ログイン/サインアップ関連のものにDjango-allauthを使用しているので、ユーザーが(初めて)自分のサイトにサインアップすると、/thanks/
ファイルで以下の設定を定義して、ユーザーをsettings.py
ページにリダイレクトします。
LOGIN_REDIRECT_URL = '/ thanks /'
しかし、ユーザーが次回ログインしようとしたとき(すでに登録されている場合)、ユーザーを'/dashboard/'
URLにリダイレクトする必要があります。
だから、まったく機能していない以下のような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/
にリダイレクトしています。これは、最初のユーザーが間違っていると判断するための私のロジックですか?
一般に、このようなロジックをシグナルハンドラーに入れようとしないでください。異なる方向に操縦したいハンドラーが複数ある場合はどうなりますか?
代わりに、これを行います。
# 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/'
2つの日時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)
1つ重要な注意ペナーズの回答へ:[〜#〜] avoid [〜#〜]混乱するのでallauth.pyという名前のファイルを使用する= Djangoそしてインポートエラーにつながります。
ser_logged_inシグナルをベースとして使用して、これら2つの他のシグナルを簡単に定義できます。それを置くのに適した場所は、signals.pyaccountsアプリ内(ある場合)、またはあなたの中にcoreアプリです。 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'
@receiver(post_user_first_login)
def handle_post_user_first_login(sender, user, request, **kwargs):
print 'post_user_first_login'