もた日記

くだらないことを真面目にやる

Djangoメモ(24) : ユーザー認証を実装する〜パスワード変更

  • パスワード変更
  • パスワード変更のテスト
  • まとめ

Python 3.6.4 Django 2.0.2

A Complete Beginner's Guide to Djangoのチュートリアルを参考にパスワード変更機能を実装する。


パスワード変更

サインアップ、ログアウト、ログイン、パスワードリセット機能を実装してきたが、最後にパスワード変更機能を実装する。
Djangoではパスワード変更のビューも提供されているのでmyproject/urls.pyに以下の2行を追加。

    path(
        'settings/password/',
        auth_views.PasswordChangeView.as_view(
            template_name='password_change.html'),
        name='password_change'),
    path('settings/password/done/',
        auth_views.PasswordChangeDoneView.as_view(
            template_name='password_change_done.html'),
        name='password_change_done'),
続きを読む

Djangoメモ(23) : ユーザー認証を実装する〜パスワードリセットとメール送信

  • パスワードリセットの流れ
  • メール送信設定
  • メールドアレス入力(password_reset.html)
  • メール送信完了(password_reset_done.html)
  • 新パスワード登録(password_reset_confirm.html)
  • パスワードリセット完了(password_reset_complete.html)
  • パスワードリセットのテスト
  • まとめ

Python 3.6.4 Django 2.0.2

A Complete Beginner's Guide to Djangoのチュートリアルを参考にパスワードリセット機能を実装する。


パスワードリセットの流れ

ログイン、ログアウトと同様にパスワードリセットのビューもDjangoで提供されているが以下のようにメール送信など手順が多い。

  1. パスワードリセットを開始するフォームでEメールアドレスを入力するとパスワードリセットリンクが記載されたメールが送信される(reset/
  2. メールが送信されたことをユーザに伝える画面が表示される(reset/done/
  3. パスワードリセットリンクにアクセスして表示されるフォームで新パスワードを入力(reset/<uidb64>/<token>/
  4. パスワードリセットが完了したことをユーザに伝える画面が表示される(reset/complete/
続きを読む

Djangoメモ(22) : ユーザー認証を実装する〜ログインと独自テンプレートタグ、フィルタ

  • ログインページ作成
  • ログインフォーム作成
  • バリデーションメッセージ
  • 独自テンプレートタグ、フィルタを作成
  • 独自テンプレートタグ、フィルタのテスト
  • まとめ

Python 3.6.4 Django 2.0.2

A Complete Beginner's Guide to Djangoのチュートリアルを参考にログイン機能を実装する。


ログインページ作成

前回ログアウト機能を実装したので次にログイン機能を実装するが、ログインもログアウト同様にビューが提供されているのでそれを利用する。
myproject/urls.pylogin/の行を追加。

from django.contrib import admin
from django.conf import settings
from django.urls import path, include
from django.contrib.auth import views as auth_views
from accounts import views as accounts_views
from boards import views

urlpatterns = [
    path('', views.home, name='home'),
    path('signup/', accounts_views.signup, name='signup'),
    path('login/', auth_views.LoginView.as_view(template_name='login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
    path('boards/<int:pk>/', views.board_topics, name='board_topics'),
    path('boards/<int:pk>/new/', views.new_topic, name='new_topic'),
    path('admin/', admin.site.urls),
]
続きを読む

Djangoメモ(21) : ユーザー認証を実装する〜ログアウト

  • ログアウトビュー
  • ログアウトメニュー追加
  • まとめ

Python 3.6.4 Django 2.0.2

A Complete Beginner's Guide to Djangoのチュートリアルを参考にログアウト機能を実装する。


ログアウトビュー

ドキュメントによるとDjangoではログイン、ログアウト、パスワード管理のビューは提供されている(サインアップは提供されていない)のでそれを利用する。ただし、テンプレートに関しては提供されていないので自分で実装する必要がある。

以下のようにURLConfを設定すると、

urlpatterns = [
    path('accounts/', include('django.contrib.auth.urls')),
]

下記URLの全パターンが有効になる。

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']
続きを読む

Djangoメモ(20) : ユーザー認証を実装する〜サインアップのテストとフォームの改良

  • サインアップのテスト
  • サインアップ成功時のテスト
  • サインアップ失敗時のテスト
  • サインアップフォームにEメールフィールド追加
  • テストの構成を変更
  • サインアップフォームのテンプレート変更
  • まとめ

Python 3.6.4 Django 2.0.2

A Complete Beginner's Guide to Djangoのチュートリアルを参考に認証関連のテストを作成してみる。


サインアップのテスト

前回サインアップ機能を作成したのでサインアップのテストを作成する。
accounts/tests.pyを以下のように修正。

from django.contrib.auth.forms import UserCreationForm
from django.urls import reverse, resolve
from django.test import TestCase
from .views import signup

class SignUpTests(TestCase):
    def setUp(self):
        url = reverse('signup')
        self.response = self.client.get(url)

    def test_signup_status_code(self):
        self.assertEquals(self.response.status_code, 200)

    def test_signup_url_resolves_signup_view(self):
        view = resolve('/signup/')
        self.assertEquals(view.func, signup)

    def test_csrf(self):
        self.assertContains(self.response, 'csrfmiddlewaretoken')

    def test_contains_form(self):
        form = self.response.context.get('form')
        self.assertIsInstance(form, UserCreationForm)
続きを読む