Djangoでユーザー登録とログイン認証を実装する

スポンサーリンク

Djangoでサインアップ・ログイン認証を実装する

今回はDjangoを使って作成したサイトにユーザー登録する仕組み、つまりサインアップとログイン認証を実装していきたいと思います。

これまでのDjangoの関連の記事は↓のにあります。

【python】Djangoを使ってウェブサイトを作成する その1

【python】Djangoを使ってウェブサイトを作成する その2

【python】Djangoを使ってウェブサイトを作成する その3

というわけで実際に編集に入っていきます。まず前準備としてデータマイグレーションでデータベースにデータテーブルを作成しておく必要があります。

htmlを用意する

サイトやアプリ作りでます必要になってくるがhtmlです。今回はログインとユーザー登録機能を付けるので、最低でもとログイン画面・ログアウト画面・サインアップ(登録画面)の3つのhtmlファイルが必要になってきます。

まあ自分でおしゃれなものが作れるのであれば、それに越したことはないのですが、一応Django公式のGithubに基本テンプレhtmlがあるので、とりあえず体裁が整ってりゃいいという人はそちらを使うといいでしょう。

テンプレートのパス(ディレクトリとファイル名)はあらかじめ決められています。Django公式が推奨しているパスはlogin.html・logged_out.html・signup.htmlの3つです。

https://github.com/toksan/django2_tutorial_blog_with_auth/tree/master/myblog/templates/registration

そして、base.htmlも追加で作ります。今回はデフォルトで拾った適当なやつを使います。

♯base.html
<html lang="en">
<head>
<link rel="stylesheet" href="style.css" />
<title>{% block title %}My site{% endblock %}</title>
</head>

<body>
<div id="sidebar">
{% block sidebar %}
<ul>
<li><a href="/">Home</a></li>
</ul>
{% endblock %}
</div>

<div id="content">
{% block content %}{% endblock %}
</div>
</body>
</html>

ベーステンプレートを作成したら、login.html・logged_out.htmlの2つを「templates」の中に「registration」というフォルダを新規作成し、その中に設置します。そして、「accounts」の中にsignup.htmlの置きます。

「registration」 と「accounts」というディレクトリを作る必要があるのは Django のコマンドで作成したpyファイルの中にそういう風にパスを通さないといけないように決まっているからです。

これでMTVのT(templates)の部分は用意できました。次はV(views)にあたる部分を編集していきます。

アカウントクラスの作成

まずアカウント関係の処理を記述するアカウントクラスを実装します。

♯アカウントクラスの実装
$ django-admin startapp accounts

これでプロジェクトフォルダ(今回はmysite)ディレクトリの直下に「accounts」というフォルダが作成されます。

setting.pyを編集する

まずはsetting.pyを編集してログインしたあとリダイレクトさせたいページを指定します。トップページにリダイレクトさせたい場合は以下のように記述します。

# ログイン後トップページにリダイレクト
LOGIN_REDIRECT_URL = '/'

加えて、install.appsの部分も編集します。

INSTALLED_APPS = [
    'accounts.apps.AccountsConfig',
    'boards.apps.BoardsConfig',
    ...
]

次はurlを紐づけするため、mysite/mysite/urls.pyのurlpatternsに以下の関数を記述します。

♯urlのところに追記する
path('accounts/', include('django.contrib.auth.urls')), 
path('accounts/', include('accounts.urls')),

これで、manage.py runserverを実行した場合以下のURLパターンが有効になります。もちろん対応するhtmlはそれぞれ自分で用意する必要があります。

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']

次はmysite/accounts/urls.py を新規作成して、urlpatternsのところに追記します。

from django.urls import path
from . import views

# set the application namespace
# https://docs.djangoproject.com/en/2.0/intro/tutorial03/
app_name = 'accounts'

urlpatterns = [
path('signup/', views.SignUpView.as_view(), name='signup'),
]

次はmyblog/accounts/views.py を編集します。

from django.contrib.auth.forms import UserCreationForm
from django.urls import reverse_lazy
from django.views import generic

class SignUpView(generic.CreateView):
      form_class = UserCreationForm
      success_url = reverse_lazy('login')
      template_name = 'accounts/signup.html'

これで基本的な設定は終わりです。ちゃんと実装できているか試しpython manage.py runserverでmanage.pyを起動してみます。

起動したら、/accounts/signup/をアクセスします。成功していれば以下のような画面が表示されるはずです。

とりあえず適当に登録してみます。ユーザー名はhoge、パスワードはhogehoge2018とでもしておきます。

これで登録出来たら次はログイン画面に移動します。

ちなみにここで登録したユーザー情報は、db.sqlite3のauth‗userというデータテーブルの中に格納されています。ログアウトすると以下のような画面になります。

とりあえずこれで基本的な実装はできました。ですが、このままだとスクリプトとか組まれた場合に無限にアクセスされる危険性があるので、メール認証なり、試行回数に制限を設ける必要があります。

またDjangoにデフォルトで実装されているユーザー登録・ログイン認証システムは一般的で、twitterなどのSNS認証みたいな別の認証をつける場合は、追加で別のライブラリをインストールする必要があります。

参照:https://it-engineer-lab.com/archives/544

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする