我正在開發'電子郵件驗證'模塊。Django)通過外部模型檢索到的用戶模型'驗證'
首先,我有一個名爲「SNUser」模式有「一對一」與默認的「用戶」下面的模型關係:
class SNUser(models.Model):
# Manager
objects = SNUserManager()
# Auth
user = models.OneToOneField(User, unique=True, primary_key=True)
我完成發送包含唯一令牌電子郵件的用戶。
當鏈接被點擊,我令牌搜索正確SNUser對象。(這令牌是SNUser模型的領域之一)。
所以我想開發什麼是點擊該標記鏈接時,正確的用戶可以使用該服務無需登錄。
點擊該鏈接所以,當「登錄(請求用戶)」應該做的。
我已經嘗試了兩種方法來解決這個問題。
- 當我從SNUser模型中檢索到的用戶模型,做了 '登錄(請求用戶)' 直接
:
snuser = SNUser.objects.get(標記=鍵)
用戶= snuser.user
登錄(請求用戶) 它導致出現錯誤:匿名用戶。
- 從SNUser模型中檢索到默認用戶後,我進行了'authenticate(username = user.username,password = user.password)'。 但你們很多人已經注意到,user.password是散列而不是rawone。所以它再次失敗。
我的目標是從包含在我發送的鏈接中的令牌中檢索用戶,並使他/她在沒有登錄模塊的情況下使用該服務,因爲許多服務都遵循此過程。
有沒有辦法解決這個問題?
謝謝!
**** ****更新
我創建的自定義後端不低於我的情況需要原始密碼:
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
在視圖中更新的關鍵代碼。Py爲以下:
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 ****
你是如何導入'login'的?你從哪裏得到錯誤?請顯示完整的回溯。 – Alasdair
我用django內置庫'從django.contrib.auth進口驗證,登錄' – LKM
@Alasdair我更新了 – LKM