我为登录系统创建了一个自定义身份验证后端。当然,当我在python shell中尝试该自定义后端时,它可以工作。但是,在服务器中运行它时出现错误。错误消息为“以下字段在此模型中不存在,或者为m2m字段:last_login”。我是否需要在客户模型中包含last_login字段,或者是否有其他解决方案来解决该问题?这是我的示例代码:
In my models.py
class Customer(models.Model):
yes_or_no = ((True, 'Yes'),(False, 'No'))
male_or_female = ((True,'Male'),(False,'Female'))
name = models.CharField(max_length=100)
email = models.EmailField(max_length=100,blank = False, null = False)
password = models.CharField(max_length=100)
gender = models.BooleanField(default = True, choices = male_or_female)
birthday = models.DateField(default =None,blank = False, null = False)
created = models.DateTimeField(default=datetime.now, blank=True)
_is_active = models.BooleanField(default = False,db_column="is_active")
@property
def is_active(self):
return self._is_active
# how to call setter method, how to pass value ?
@is_active.setter
def is_active(self,value):
self._is_active = value
def __str__(self):
return self.name
在backends.py中
from .models import Customer
from django.conf import settings
class CustomerAuthBackend(object):
def authenticate(self, name=None, password=None):
try:
user = Customer.objects.get(name=name)
if password == getattr(user,'password'):
# Authentication success by returning the user
user.is_active = True
return user
else:
# Authentication fails if None is returned
return None
except Customer.DoesNotExist:
return None
def get_user(self, user_id):
try:
return Customer.objects.get(pk=user_id)
except Customer.DoesNotExist:
return None
在views.py中
@login_required(login_url='/dataInfo/login/')
def login_view(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(name=username,password=password)
if user is not None:
if user.is_active:
login(request,user)
#redirect to user profile
print "suffcessful login!"
return HttpResponseRedirect('/dataInfo/userprofile')
else:
# return a disable account
return HttpResponse("User acount or password is incorrect")
else:
# Return an 'invalid login' error message.
print "Invalid login details: {0}, {1}".format(username, password)
# redirect to login page
return HttpResponseRedirect('/dataInfo/login')
else:
login_form = LoginForm()
return render_to_response('dataInfo/login.html', {'form': login_form}, context_instance=RequestContext(request))
在setting.py中
AUTHENTICATION_BACKENDS = ('dataInfo.backends.CustomerAuthBackend', 'django.contrib.auth.backends.ModelBackend',)
发生这种情况是因为您正在使用django的login()
功能来登录用户。
Django的login
函数会发出一个信号user_logged_in
,该信号以user
您提供的实例作为参数命名。参见login()
源代码。
并在django的中收听到此信号contrib.auth.models
。它尝试更新一个名为的字段,last_login
假设您提供的用户实例是django默认AbstractUser
模型的子类。
为了解决此问题,您可以执行以下操作之一:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句