【问题标题】:django authenticate() still allways returns Nonedjango authenticate() 仍然总是返回 None
【发布时间】:2015-12-21 23:22:48
【问题描述】:

我从昨天开始编辑了我的问题: django authenticate() allways returns None,但我认为没有人会注意,因为我已经将问题标记为已回答。 - authenticate() 在 shell 中工作(昨天没有工作) - 在我看来,我可以检索用户并成功检查其密码 但是话又说回来,当我尝试在我的视图中使用 authenticate() 函数时,我得到了一个 None 类型的对象。我什至删除并重新创建了数据库,但行为仍然相同。 我的设置.py:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    #'django.contrib.auth.middleware.RemoteUserMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.contrib.staticfiles.finders.FileSystemFinder',
)

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',                           
    #'django.contrib.auth.backends.RemoteUserBackend',
    )

浏览量: 从 django.contrib.auth.models 导入用户 从 django.contrib.auth 导入验证

def authentifizieren(request):
    """
    """
    if request.method == 'POST':
        uname = request.POST['username']
        passwd = request.POST['password']
        dbuser = User.objects.get(username=uname)
        dbuvalid=dbuser.check_password(passwd)
        auser = authenticate(username=uname, password=passwd)
        print('***************************************', dbuser,dbuvalid)
        print('***************************************', auser)
    if (auser != None):
        login(request, auser)
    return redirect('/startseite')

输出:

*************************************** test True
*************************************** None

我还硬编码了用户/密码字符串以排除与编码相关的问题,但没有成功。 顺便问一下,什么是 MCVE?

【问题讨论】:

  • 您有AUTH_USER_MODEL 设置吗?
  • 不,但是当我搜索时,我发现了一些奇怪的事情:我创建了一个新项目来在新环境中测试问题,新设置文件中的版本是 1.8.4,(我预计1.8.2,我在windows中下载的那个),我正在处理的项目中的设置文件版本是1.7。我没有更新或类似的事情。

标签: python django authentication


【解决方案1】:

现在 authenticate() 可以工作了。这是版本不匹配。现在我记得我在家里创建了初始项目,在我的 gentoo 机器上仍然安装了 1.7.7 版本,在工作的 windows 机器上安装了 1.8.4。,我认为这是不同的设置文件,愚蠢我的错误。

很抱歉给您带来不便

【讨论】:

    【解决方案2】:

    在 django 2.1 或更高版本上,您应该将请求传递给函数 authenticate 以进行自定义身份验证。 例如:

    class PasswordlessAuthenticationBackend(object):
    
        def authenticate(self, request, uid):
            try:
                token = Token.objects.get(uid=uid)
                print('got user', file=sys.stderr)
                return ListUser.objects.get(email=token.email)
            except ListUser.DoesNotExist:
                print('new user', file=sys.stderr)
                return ListUser.objects.create(email=token.email)
            except Token.DoesNotExist:
                return None
    

    最后,不要忘记settings.py中的设置: 1.accounts是你的应用名称 2. ListUser 是你的模型名

    AUTH_USER_MODEL = 'accounts.ListUser'
    AUTHENTICATION_BACKENDS = (
        'accounts.authentication.PasswordlessAuthenticationBackend',
    )
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多