--- title: \[Django] - 玖-3、login view tags: webdevelopment --- 本篇目標完成login view Django本身就有建立一些驗證身份的方法給使用他的人使用 例如: authenticate這個功能可以把使用者名稱及密碼帶入之後 從後台比對資料,如果正確會回傳一個user物件讓我們知道這組使用者名稱及密碼是有效的 或是 login,這個的功能是讓使用者在操作網頁時,只要還在我們規劃的同一個app就不需要多次驗證身份減少麻煩和伺服器負擔 首先一樣打開views.py並輸入 ```code=python # Import 需要的模組 from django.http import HttpResponseRedirect, HttpResponse, from django.urls import reverse from django.contrib.auth.decorators import login_required from django.contrib.auth import authenticate, login, logout # user_login view # 登入使用到django幫我們寫好的驗證系統 def user_login(request): # 檢查使用者是否已經登入 if request.user.is_authenticated: # 是,導回首頁 return HttpResponseRedirect(reverse('ranking:index')) else: # 否,檢查request的表單是否是用POST的方法傳入 if request.method=='POST': # 是POST! form = LoginForm # 從中獲得使用者名稱跟密碼 username = request.POST.get('username') password = request.POST.get('password') # 驗證是否有這個使用者,及密碼是否正確 # 若驗證有效,建立一個User的物件 # 無效,後端會顯示PermissionDenied並回傳None user = authenticate(username=username, password=password) if user: if user.is_active: # 讓使用者在使用時不需要重複驗證 login(request, user) return HttpResponseRedirect(reverse('ranking:index')) else: return HttpResponse("ACCOUNT NOT ACTIVE") else: # 使用者物件為None print("Someone tried to login and failed!") print("Username: {} and password {}".format(username, password)) return HttpResponse("Fail to login. Maybe your username or password is wrong.") else: # 如果是用其他方法傳入表單,則不動作 form = LoginForm return render(request, 'ranking/login.html', context = {'form':form}) ``` 完成,大家一定會想那登出呢? 在Django中,登出非常簡單,只要建立一個登出的view並輸入以下程式碼就可以達成 logout這個函式會幫我們清除目前使用者的request而且會移除沒有儲存的資料 ```code=python @login_required def user_logout(request): logout(request) return HttpResponseRedirect(reverse('ranking:index')) ``` 如此一來就完成啦,下一篇我們就會完成最後一個註冊view的功能了 謝謝大家的收看! 如果有任何想法或是問題歡迎寄信到 chantinghsien@gmail.com 可以一起討論和分享新知