Python Can';t使用自定义身份验证后端登录

Python Can';t使用自定义身份验证后端登录,python,django,authentication,django-models,Python,Django,Authentication,Django Models,我正在使用LDAP创建自定义身份验证后端。我想检查数据库中是否存在用户,但将密码检查“委托”给LDAP(密码更改通常是由于公司策略) 使用django管理界面时,后端工作正常,但使用FormView创建自定义登录页时,出现以下错误: Environment: Request Method: POST Request URL: http://localhost:8000/accounts/login/ Django Version: 1.7 Python Version: 3.4.2 Ins

我正在使用LDAP创建自定义身份验证后端。我想检查数据库中是否存在用户,但将密码检查“委托”给LDAP(密码更改通常是由于公司策略)

使用django管理界面时,后端工作正常,但使用FormView创建自定义登录页时,出现以下错误:

Environment:


Request Method: POST
Request URL: http://localhost:8000/accounts/login/

Django Version: 1.7
Python Version: 3.4.2
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'widget_tweaks',
 'defekts',
 'account')
Installed Middleware:
('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.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "/var/www/django_local/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/var/www/django_local/lib/python3.4/site-packages/django/views/generic/base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)
File "/var/www/django_local/lib/python3.4/site-packages/django/views/generic/base.py" in dispatch
  87.         return handler(request, *args, **kwargs)
File "/var/www/django_local/lib/python3.4/site-packages/django/views/generic/edit.py" in post
  173.             return self.form_valid(form)
File "/var/www/django_local/local/account/views.py" in form_valid
  17.         auth_login(form.request, user)
File "/var/www/django_local/lib/python3.4/site-packages/django/contrib/auth/__init__.py" in login
  86.     if SESSION_KEY in request.session:

Exception Type: AttributeError at /accounts/login/
Exception Value: 'NoneType' object has no attribute 'session'
设置.py

AUTHENTICATION_BACKENDS = (
    #'django.contrib.auth.backends.ModelBackend',
    'account.LDAPBackend.LDAPBackend',
)
views.py

from django.contrib.messages.views import SuccessMessageMixin, messages
from django.core.urlresolvers import reverse, reverse_lazy
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login as auth_login, logout as auth_logout
from django.views.generic import FormView

# Create your views here.

class LoginView(FormView):
    form_class = AuthenticationForm
    template_name = 'account/login.html'
    success_url = reverse_lazy("defekts:index")

    def form_valid(self, form):
        user = form.get_user()
        auth_login(form.request, user)
        return super(LoginView, self).form_valid(form)
帐户/LDAPBackend/init.py

import ldap
from django.contrib.auth.models import User, check_password
from django.contrib.auth import get_user_model

class LDAPBackend(object):

    def authenticate(self, username=None, password=None):

        if username is None:
            return None

        try:
            # user = User.objects.get(username=username)
            user = get_user_model().objects.get(username=username)
        except User.DoesNotExist:
            # TODO: Raise error
            return None

        try:
            connection = ldap.initialize("ldap://example.com")
            connection.protocol_version = ldap.VERSION3
            connection.simple_bind_s("example.com\\"+username, password)
        except ldap.INVALID_CREDENTIALS:
            return None
        except ldap.SERVER_DOWN:
            # TODO: Return error instead of none
            return None

        return user

    def get_user(self, userid):
        try:
            return User.objects.get(pk=userid)
        except User.DoesNotExist:
            return None

我错过什么了吗?提前感谢。

当调用
验证登录时,请执行
自我请求
,而不是
表单请求

调用
auth\u login
时,执行
self.request
而不是
form.request

调用
auth\u login
时,执行
self.request
而不是
form.request

调用
auth\u login
时,执行
self.request
而不是
form.request

您可以使用或至少查看实现我正在使用python 3.4进行此项目,尝试了此项目的fork-但效果不好,因此我决定创建自己的简单后端。您可以使用或至少查看实现我正在使用python 3.4进行此项目,尝试了此项目的fork-但效果不好,因此,我决定创建自己的简单后端。您可以使用或至少查看实现我正在使用python 3.4进行此项目,尝试使用此项目的fork-但它们工作不好,所以我决定创建自己的简单后端。您可以使用或至少查看实现我正在使用python 3.4进行此项目,我尝试过这个项目的分支,但它们并不好用,所以我决定创建自己的简单后端。不用担心,它会发生。从技术上讲,他们(Django)不应该在表单上有
request
属性而不填充它。我认为在表单中添加请求没有任何理由。你能解释一下吗?不用担心,这是常有的事。从技术上讲,他们(Django)不应该在表单上有
request
属性而不填充它。我认为在表单中添加请求没有任何理由。你能解释一下吗?不用担心,这是常有的事。从技术上讲,他们(Django)不应该在表单上有
request
属性而不填充它。我认为在表单中添加请求没有任何理由。你能解释一下吗?不用担心,这是常有的事。从技术上讲,他们(Django)不应该在表单上有
request
属性而不填充它。我认为在表单中添加请求没有任何理由。你能解释一下吗?