iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 28
1
Modern Web

From Django 1.11 to Django 2.1 系列 第 28

Day28 : Django auth - 登入/登出

前言

今天來說些實際會應用的功能吧!

Django 提供了相當方便的 auth 介面,可以讓我們更快速的完成 login/logout 的功能

廢話不多說,我們直接進入正題吧!


正文開始

如果你還有印象的話,在一開始我們介紹 settings 的時候,就有看到許多預設的設定

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'vendor.apps.VendorConfig', # extra
    'welcome.apps.WelcomeConfig', # extra
]

而最下面那兩個 apps 是在前幾天介紹其他 Django 的功能時所建立的,所以實際上在我們創建好一個專案時,Django在這個INSTALLED_APPS就已經有六個內建的設定,那我們今天要說的是 django.contrib.auth

要使用 Django 內建的 auth 相當的簡單,只要在 urls.py

# 新增 urls.py 再進行修改
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
	... 略
    path('accounts/', include('django.contrib.auth.urls')), # 新增
]

對於 include 而言, django.contrib.auth.urls 就另一個檔案,以下是它的原始碼

from django.contrib.auth import views
from django.urls import path

urlpatterns = [
    path('login/', views.LoginView.as_view(), name='login'),
    path('logout/', views.LogoutView.as_view(), name='logout'),

    path('password_change/', views.PasswordChangeView.as_view(), name='password_change'),
    path('password_change/done/', views.PasswordChangeDoneView.as_view(), name='password_change_done'),

    path('password_reset/', views.PasswordResetView.as_view(), name='password_reset'),
    path('password_reset/done/', views.PasswordResetDoneView.as_view(), name='password_reset_done'),
    path('reset/<uidb64>/<token>/', views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
    path('reset/done/', views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),
]

從上面的原始碼我們可以知道,再我們定義好了 path('logout/', views.LogoutView.as_view(), name='logout'),等同於是額外新增了以下這些路徑可以使用

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 就可以了 (((蛤,你在跟我開玩笑?? 這麼快?

沒錯,就是這麼快 ^^"

但是新增這一個 template的位置及名稱是有限制的,要在 top-level 的 template 底下新增 registration 然後新增 login.html

# template/registration/login.html
{% extends "base.html" %}
{% block title %}
Login
{% endblock title %}
{% block content %}
<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<table>
  <tr>
    <td>{{ form.username.label_tag }}</td>
    <td>{{ form.username }}</td>
  </tr>
  <tr>
    <td>{{ form.password.label_tag }}</td>
    <td>{{ form.password }}</td>
  </tr>
</table>
<input type="submit" value="login">
</form>
{% endblock content %}

然而,當使用者成功登入以後,我們要幫他轉網址,這時候只要到 settings 新增

LOGIN_REDIRECT_URL = '/'

即可!

說實在話,到目前為止我都還沒有在初始化面建立網頁,我們就來建一下吧!

from django.contrib import admin
from django.urls import path, include
from .views import test
from django.views.generic.base import TemplateView # 新增
urlpatterns = [
	...略
    path('accounts/', include('django.contrib.auth.urls')),
    path('', TemplateView.as_view(template_name='home.html')) # 新增
]

透過 TemplateView 這個 CBV,我們能夠直接把 template的屬性加在後方直接使用!

{% extends "base.html" %}
{% block title %}
HomePage
{% endblock %}
{% block content %}
{% if user.is_authenticated %}
  Hello, {{ user.username }}!
{% else %}
  <p>You are not logged in</p>
  <a href="{% url 'login' %}">Login Page</a>
{% endif %}
{% endblock %}

在完成登入之後,就可以看到這個畫面
https://ithelp.ithome.com.tw/upload/images/20181028/20111829McdhOr696x.jpg

接著就只剩下登出的動作囉,我們要做的事情跟登入,它需要轉網址的設定,最簡單的方式就是在 settings 新增

LOGOUT_REDIRECT_URL = '/'

並將 home.html 修改成這樣

{% extends "base.html" %}
{% block title %}
HomePage
{% endblock %}
{% block content %}
{% if user.is_authenticated %}
  Hello, {{ user.username }}!</br>
  <a href="{% url 'logout' %}">Logout</a><br>
{% else %}
  <p>You are not logged in</p>
  <a href="{% url 'login' %}">Login Page</a>
{% endif %}
{% endblock %}

這是登出後的畫面
https://ithelp.ithome.com.tw/upload/images/20181028/20111829DtiK7XB8Rq.jpg

這樣就完成了一個陽春的登入及登出


今日小節

今天帶大家了解 Django 內建的 auth 所提供的強大能力,大家只要再費點功夫,把畫面改成自己喜歡的樣子,而我只是帶大家了解如何操作,所以就沒有在 html、css 下太多工夫囉 ^^"

今天介紹到這邊,我們明天見~


上一篇
Day27 : CBV vs. FBV
下一篇
Day29 : Django 註冊
系列文
From Django 1.11 to Django 2.1 30

尚未有邦友留言

立即登入留言