我有自定义 Django 登录表单,自从从 Django 1.8
升级到 2.2
后,不再让用户在 HttpResponseRedirect
后登录。这是代码的通用示例:
@render_with('users/login.html')
def login_view(request, campaign_id=None):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
email = form.cleaned_data['email']
password = form.cleaned_data['password']
# Login user
user = authenticate(request, email=email, password=password)
if user:
if user.is_active:
login(request, user)
return HttpResponseRedirect('/redirect-user/')
我知道 login()
工作正常,因为如果我使用 render
而不是 HttpResponseRedirect
,用户就会登录。但是,我想在登录后将用户重定向到不同的 View 。执行此操作的最佳方法是什么?
更新
罪魁祸首似乎是我的自定义身份验证后端 EmailOrUsernameModelBackend
。知道我做错了什么吗?
settings.py
AUTHENTICATION_BACKENDS = (
'social_core.backends.open_id.OpenIdAuth',
'social_core.backends.google.GoogleOpenId',
'social_core.backends.facebook.FacebookOAuth2',
'social_core.backends.google.GoogleOAuth2',
'social_core.backends.linkedin.LinkedinOAuth2',
'users.backends.EmailOrUsernameModelBackend',
'django.contrib.auth.backends.ModelBackend',
)
__init__.py
class EmailOrUsernameModelBackend(object):
supports_object_permissions = False
supports_anonymous_user = False
supports_inactive_user = False
def authenticate(self, request, email=None, password=None):
if '@' in email:
kwargs = {'email': email.lower() }
else:
kwargs = {'username__iexact': email.lower() }
try:
user = User.objects.get(**kwargs)
if user.check_password(password):
return user
except User.DoesNotExist:
return None
此外,如果我更改代码并再次注销/登录以进行测试,它会在第一个测试中运行,但在对同一用户的后续测试中会失败。
最佳答案
感谢@Sayse 关于导致问题的中间件/后端的建议。删除 'users.backends.EmailOrUsernameModelBackend'
解决了上述问题中的问题,但因此在新用户注册后中断了我的登录。为了让登录和注册都正常工作,我切换了 EmailOrUsernameModelBackend
和 ModelBackend
中的另一个:
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'users.backends.EmailOrUsernameModelBackend',
)
根据 Django docs :
The order of AUTHENTICATION_BACKENDS matters, so if the same username and password is valid in multiple backends, Django will stop processing at the first positive match.
我仍然不确定 EmailOrUsernameModelBackend
有什么问题导致我无法登录,但这确实解决了问题。如果有人对根本原因(即此后端有什么问题)有更好的解决方案,我将接受为最佳答案。
关于python - Django login() 在 HttpResponseRedirect 之后不会持续存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57295066/