Я разрабатываю модуль проверки электронной почты.Django) 'authenticate' с моделью пользователя, полученной иностранной моделью
Прежде всего, у меня есть модель под названием «SNUser» с «один к одному» отношения с моделью по умолчанию «пользователя» ниже:
class SNUser(models.Model):
# Manager
objects = SNUserManager()
# Auth
user = models.OneToOneField(User, unique=True, primary_key=True)
Я закончил отправки электронной почты, содержащее уникальный маркер для пользователя ,
Когда ссылка нажата, я искал нужный объект SNUser токеном. (Этот токен является одним из полей модели SNUser).
Итак, что я хочу разработать, так это то, что при нажатии этой ссылки токена правильный пользователь может использовать услугу без входа в систему.
Поэтому, когда нажимается эта ссылка, необходимо выполнить 'login (request, user)'.
Я уже пробовал два способа решить эту проблему.
, когда я извлек пользовательскую модель из модели SNUser и сделал 'Логин (запрос, пользователь)' непосредственно:
snuser = SNUser.objects.get (маркер = ключ)
user = snuser.user
login (request, user) Результаты с ошибкой: Анонимный пользователь.
- После извлечения пользователя по умолчанию из модели SNUser я выполнил 'authenticate (username = user.username, password = user.password)'. Но многие из вас уже заметили, что user.password - это хеширование, а не простое. Так что это снова не срабатывает.
Моя цель - извлечь пользователя из токена, включенного в ссылку, которую я отправил, и заставить его/ее использовать услугу без модуля входа в систему, так как многие службы следуют этому процессу.
Есть ли способ решить эту проблему?
Спасибо!
**** **** UPDATE
Я создал пользовательский бэкенд не требует сырого пароля для моей ситуации ниже:
class SNUserEmailVerificationAuthBackend(ModelBackend):
def authenticate(self, username=None, email=None):
try:
return User.objects.get(username=username, email=email)
except User.DoesNotExist:
return None
def get_user(self, username):
try:
return User.objects.get(username=username)
except User.DoesNotExist:
return None
Обновленных критический кода во взглядах.ру ниже:
snuser.is_email_verified = True
snuser.save()
user = snuser.user
manager=SNUserEmailVerificationAuthBackend()
new_user=manager.authenticate(username=user.username,email=user.email)
login(request,new_user)
Логин (запрос, new_user)
Выше линии работает (это означает suceeds пользователя в Вход для реселлеров в), но поднимая ошибку одновременно: объект «Пользователь» не имеет атрибута ' бэкенд»
**** дублированы MARK REMOVE ****
Как вы импортировали 'login'? Откуда у вас ошибка? Пожалуйста, покажите полную трассу. – Alasdair
Я использовал встроенную библиотеку django 'из django.contrib.auth import authenticate, login' – LKM
@Alasdair Я обновил – LKM