使用者驗證(Authentication)
Django 內建一套完整的使用者驗證系統:帳號密碼儲存(含雜湊加密)、登入/登出、密碼變更/重設,這些功能都已經寫好,多數情況下不需要自己刻登入邏輯。
官方文件:User authentication in Django、Using the Django authentication system。
準備動作
新建立的 Project,驗證系統需要的 App(django.contrib.auth 等)預設就已經加進 settings.py。接下來只需要建立資料表,並建立一個後台管理帳號:
createsuperuser 也可以加參數直接帶入帳號資訊:
Project 的 URLconf 設定
Django 內建一組現成的登入相關網址,只要在 Project 的 urls.py 加上一行 include():
這一行等於一次設定好底下這些路徑:
accounts/login/ [name='login']
accounts/logout/ [name='logout']
accounts/password_change/ [name='password_change']
accounts/password_change/done/ [name='password_change_done']
accounts/password_reset/ [name='password_reset']
accounts/password_reset/done/ [name='password_reset_done']
accounts/reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/reset/done/ [name='password_reset_complete']
這些網址預設對應的 Template,都要放在 templates/registration/ 底下,例如登入頁要放在 templates/registration/login.html。如果想把 Template 放在別的位置,需要改用比較完整的寫法,把每個網址都自己加進 URLconf、並指定 template_name:
urlpatterns = [
path(
"change-password/",
auth_views.PasswordChangeView.as_view(template_name="change-password.html"),
),
]
路徑設定好之後,在 Template 中可以直接用 form 這個變數畫出表單:
<form action="" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="submit">
</form>
存取會員限定的頁面
要限制某個頁面只有登入的使用者能看,依 View 的寫法分成兩種:
@login_required:裝飾器,用於 Function-Based Views。LoginRequiredMixin:Mixin 類別,用於 Class-Based Views(見 Class-Based Views)。
未登入的使用者存取這類頁面時,會被自動導向 login_url 指定的登入頁,登入成功後再導回原本想造訪的頁面。
@login_required 範例
from django.contrib.auth.decorators import login_required
@login_required(login_url="/accounts/login/")
def my_view(request):
...
LoginRequiredMixin 範例
from django.contrib.auth.mixins import LoginRequiredMixin
class MyView(LoginRequiredMixin, View):
login_url = "/login/"
redirect_field_name = "redirect_to"
下一步
如果想讓使用者能用 Google、GitHub 等第三方帳號直接登入,不用自己管理密碼,請看 Django-Allauth。