python - Django login() 在 HttpResponseRedirect 之后不会持续存在

标签 python django python-3.x authentication

我有自定义 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' 解决了上述问题中的问题,但因此在新用户注册后中断了我的登录。为了让登录和注册都正常工作,我切换了 EmailOrUsernameModelBackendModelBackend 中的另一个:

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/

相关文章:

python - 像交互式 Ruby 一样的交互式 Python?

python - 从列表中随机删除两个相邻值

python - 为什么扩展切片分配不如常规切片分配灵活?

python-3.x - 无法在 Airflow Python 3 中发布 Pubsub 消息

python - python 中的数学限制?

django - 如何截断文本并删除 django 模板中的 html 标签

python - Django 项目中的 SORL-thumbnail 导入错误

django - 使用rest api构建简单的cms web应用程序

使用 Numpy 进行类似 MATLAB 的数组索引

django - 编写包装器以将现有 REST API 公开为 SOAP Web 服务?