我的主要要求是进行电子邮件身份验证。尽管我的自定义身份验证后端似乎工作正常,但即使在成功使用我的自定义后端进行身份验证后,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 以匿名方式打开用户。
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/