2017-02-21 131 views
0

我用Django的身份驗證系統登錄用戶,唯一的問題是我得到1062 DUPLICATE ENTRY錯誤。使用Django登錄現有用戶時出現DUPLICATE錯誤

def login(request): 
    # this will be the first page someone who isn't signed in will see 
    form = LoginForms(request.POST) 
    username = request.POST.get('username') 
    password = request.POST.get('password') 
    if username and password: 
     #this line returns two values, a user object and a boolean flag 'created', 'true' if user is created and false if user already exists 
     try: 
      user,created = User.objects.get_or_create(username=username, password=password) 
      if created: 
       user.set_password(password) 
       user.save() 
       #if the user already exists 
      user = authenticate(username=username, password=password) 
      auth_login(request, user) 
      return HttpResponse('success') 
     except IntegrityError: 
      user = authenticate(username=username, password=password) 
      auth_login(request, user) 
      return HttpResponse('good') 

    else: 
     return render(request, 'tracker/login.html', {'form': form}) 

現在我只是捕捉錯誤,並基本上告訴Django無論如何登錄。但是我知道這不是一個好的做法,如果用戶不存在,使用User.objects.get來測試用戶是否存在與User.objects.create_user相結合來創建用戶會更有意義嗎?

編輯加了我自己的嘗試,似乎工作:

def login(request): 
    # this will be the first page someone who isn't signed in will see 
    form = LoginForms(request.POST) 
    username = request.POST.get('username') 
    password = request.POST.get('password') 
    if username and password: 
     exists = User.objects.filter(username=username) 
     if exists: 
      user = authenticate(username=username, password=password) 
      auth_login(request, user) 
      return HttpResponse('Logged in') 
     else: 
      User.objects.create_user(username=username, password=password) 
      user = authenticate(username=username, password=password) 
      auth_login(request, user) 
      return HttpResponse('created new user') 

    else: 
     return render(request, 'tracker/login.html', {'form': form}) 

EDIT 2固定的,因此無效的密碼會產生一個錯誤

​​

回答

1

要檢查你能做的存在

user = User.objects.filter(username=username).exists() here user將是一個bool

,並指望它

user = User.objects.filter(username=username).count() 這裏user將是一個int

但你永遠不應該得到重複user你應該做更多的檢查

在這裏你可以檢查是否存在以及它們的計數,如果count是1,那麼只有它應該login

如果沒有存在那麼只有打造user

是啊,還我會建議

user = authenticate(username=username, password=password)  
if user: 
    login(request,user) 
    return HttpResponse('success') 
+0

感謝您的回覆,我忘了'filter()'。在我問了這個問題之後,我編輯了自己的代碼,試圖找出它,直到我使用'filter()'後才能正常工作。雖然它仍然與你的不同,你能告訴我你的想法嗎? – Amon

+0

是的,它會正常工作,但有關您的**重複**'用戶'錯誤,它會再次發生,我猜 – Bijoy

+1

因爲如果有多個用戶,'存在'將有價值和條件'如果存在: '將執行導致錯誤 – Bijoy

1

你想在這一行做什麼:

  user,created = User.objects.get_or_create(username=username, password=password) 

用於在數據庫中查找用戶,其中用戶名與指定的用戶名匹配,密碼與密碼匹配。但是密碼是,不存儲爲作爲明文,所以基本上這種查找會每次都失敗。當查找失敗時,django會嘗試使用指定的用戶名和密碼創建新用戶,但具有給定用戶名的用戶可能已經存在。

  user,created = User.objects.get_or_create(username=username) 

它應該可以正常工作。

+0

非常感謝,我只是編輯了我的問題並添加了我自己的嘗試。你認爲這會比你回答更好還是更糟? – Amon

相關問題