我从旧项目中回收了一些代码(Django 1.7) 在新的(Django 1.8)中使用它,所以每次我想登录时都会出现这个错误
它在Django 1.7中运行良好
对于我的模型,我使用的是AbstractBaseUser
models.py
class Student(AbstractBaseUser, models.Model):
email = models.EmailField(max_length=50)
user_id = models.CharField(max_length=8, null=False, editable=False, default=id_generator, primary_key=True)
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20)
prom_code = models.CharField(max_length=8, null=False, default="")
gender = (("M","Male"),("F","Female"),)
gender = models.CharField(max_length=1, choices=gender, default="M", null=False)
USERNAME_FIELD = 'email'
@property
def is_superuser(self):
return False
def has_perm(self, perm, obj=None):
return False
def has_module_perms(self, app_label):
return False
@property
def is_staff(self):
return False
def save(self, **kwargs):
if not self.user_id:
self.user_id = id_generator()
while Student.objects.filter(user_id = self.user_id).exists():
self.user_id = id_generator()
super(Student, self).save()
我制作了自定义身份验证
auth_backend.py
from registration_app.models import Student
import md5
class ClientAuthBackend(object):
def authenticate(self, username=None, password=None):
try:
user = Student.objects.get(email=username)
password_ver = md5.new(password).hexdigest()
if user.check_password(password_ver):
return user
else:
print("Entre aqui")
return None
except Student.DoesNotExist:
print("Entre aqui2")
return None
def get_user(self, user_id):
try:
user = Student.objects.get(user_id=user_id)
if user is not None:
return user
except Student.DoesNotExist:
return None
views.py
def user_login(request):
args = {}
form = LoginForm(request.POST)
username = request.POST.get('email', '')
password = request.POST.get('password', '')
user = authenticate(username=username, password=password)
if user is not None:
print user.first_name + " ah iniciado session"
login(request, user) #-----**Here is where i get the problem**-----
return HttpResponseRedirect('/user/')
else:
print("El usuario no existe")
args['form'] = form
return render(request, 'user_student/login.html', args)
在我的命令提示符下,我实际上可以看到用户已登录(它为我提供了用户名)
答案 0 :(得分:1)
根据Django文档:
Django管理员与Django User对象紧密耦合。该 处理这个的最好方法是为每个创建一个Django User对象 用于后端的用户(例如,在您的LDAP目录中,您的 外部SQL数据库等)您可以编写脚本来执行此操作 提前,或者你的身份验证方法可以在第一次做到 用户登录。
https://docs.djangoproject.com/en/1.11/topics/auth/customizing/
您的用户使用非数字PK 会发生什么,而Django并不喜欢这样。我遇到了同样的问题。
如文档中所述,您应为每个身份验证创建用户(如果它尚未存在)并更改中的 get_user 方法> ClientAuthBackend 返回:
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
我改变之后,一切顺利。
答案 1 :(得分:1)
此错误来自您的Django会话。我用
解决了- python manage.py shell
在外壳上,我跑了
> from django.contrib.sessions.models import Session
> Session.objects.all().delete()
您可以通过运行来检查创建的会话
Assuming the userid = '2b1189a188b44ad18c35e113ac6ceead'
s = Session.objects.get(pk='2b1189a188b44ad18c35e113ac6ceead')
您可以了解有关会话here
的更多信息我希望这会有所帮助。