Django 自定义后端 : Cannot Login when using custom backend for authentication with email

标签 django django-authentication

我的主要要求是进行电子邮件身份验证。尽管我的自定义身份验证后端似乎工作正常,但即使在成功使用我的自定义后端进行身份验证后,user.is_anoynymous() 函数仍然是True。当使用默认身份验证模型时,一切似乎都很好。

views.py:

 from testapp.models import *
 from django.http import HttpResponseRedirect,HttpResponse,Http404,QueryDict
 from django.shortcuts import    render_to_response,  RequestContext         
from django.template import Context
from django.core.paginator import Paginator,QuerySetPaginator
from django.template.loader import get_template
from django.contrib.auth   import    logout,authenticate,login
from django.contrib.auth.views import *
from testapp.forms import *
from django.contrib.auth.decorators import login_required
from django.views.generic import ListView
from testapp.backends import EmailBackend
from testapp.backends import EmailBackend

def main_page(request):
    return render_to_response('main_page.html',{
        'user':request.user
    })

def loggedout(request):
    logout(request)
    return HttpResponseRedirect('/')

def custom_login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
    if form.is_valid():
        email = request.POST['email']
        password =  request.POST['password1']

        cb = EmailBackend()
        user = cb.authenticate(email,password)
        # return HttpResponse(user.username)
        if user is not None:
            if user.is_active:
                login(request,user)
                return HttpResponseRedirect('/')
            else:
                return HttpResponse('USer is not Active')
        else:
            return HttpResponse('USer Not found')
else:
    form = LoginForm()
    page_var = RequestContext(request, {
        'form':form, 
    })
    return render_to_response('customlogin.html',page_var)`

后端.py:

from django.contrib.auth.models import User
from django.contrib.auth.backends import ModelBackend

class EmailBackend(ModelBackend):

    def authenticate(self,email= None,password= None):
        try:
            user = User.objects.get(email=email)

            if user is not None:
                if user.check_password(password):
                    return user
                else :
                    return None
            else:
                return None
        except User.DoesNotExist:
            return None

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

设置.py:

AUTHENTICATION_BACKENDS = ('testapp.backends.EmailBackend','django.contrib.auth.backends.ModelBackend')

main_page.html:

{% extends "base.html" %}
{% block title %}Welcome to Django Bookmarks{% endblock %}
{% block head %}Welcome to Django Bookmarks{% endblock %}
{% block content %}
{% block customadd %}
    kskdsdsdl;sd
    {% endblock %}
{% if user.username %}
<p>Welcome {{ user.username }}!
Here you can store and share bookmarks!</p>
{% else %}
<p>Welcome anonymous user!
You need to <a href="/login/">login</a>.</p>
{% endif %}
{% endblock %}

现在,虽然 main_page.html 在成功身份验证后被调用,但在主页中 {{user.username}} 始终为 None ,因此 main_page.html 以匿名方式打开用户。

view.py 中 main_page 函数中的

user.is_anonymous() 返回 True。我犯了什么错误?重定向到 main_page.html 后,我应该看到用户已登录。

编辑1:上次我故意没有将所有包含在views.py中的包放在其中,所以我现在更新了它。

最佳答案

Django 提供了 login view 。我建议您使用它而不是自己编写。

如果您使用 Django 登录 View ,Django 将使用您的身份验证后端,因为您已将其添加到 AUTHENTICATION_BACKENDS 设置中。

您需要对后端进行一些小的更改 - 将字段名称从 email 更改为 username,以便它与登录表单匹配。您仍然可以根据用户的电子邮件过滤用户。

def authenticate(self, username=None, password= None):
    try:
        user = User.objects.get(email=username)

如果您继续使用自己的登录 View ,我可以看到一些可能的问题。首先,您应该导入 authenticate方法,并调用它而不是实例化您的登录后端。

from django.contrib.auth import authenticate

def custom_login(request):
    ...
    user = authenticate(email=email, password=password)
    ...

其次,当您调用 login(request, user) 时,请确保您导入了正确的 login 方法,而不是 login查看我上面提到的。

from django.contrib.auth import login

关于Django 自定义后端 : Cannot Login when using custom backend for authentication with email,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34774592/

相关文章:

python - 如何返回表中最受欢迎的项目,但每个项目都是唯一的?

python - Django:上传的文件编码问题

django - 如何解决 Facebook 上的 django 社交身份验证错误?

django - 使用 "other authentication sources"时可以避免创建 Django auth.model.User 表吗?

django - django 到底如何验证它的 cookie?

python - 如何在django中自定义{% bootstrap_form form %}?

Django - 如何使用 UpdateView CBV 发送成功消息

django - 在 Django 中使用 markdown :"safe"会出现语法错误

python - 没有名为 'backends' 的模块

ajax - Phonegap 和 Django 身份验证