Djangoを使ってログインの実装を行います。
元々Djangoが持っている認証システムを使っての実装になります。
公式ドキュメントで詳細など確認できます。
https://docs.djangoproject.com/ja/2.1/topics/auth/default/
尚、以下のバージョンを使っての実装をしています。
python3.6
django2.1.1
1 2 3 4 5 6 7 8 9 10 11 12 |
$ python --version Python 3.6.6 $ python Python 3.6.6 (default, Sep 12 2018, 05:39:17) [GCC 7.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import django >>> django.VERSION (2, 1, 1, 'final', 0) |
認証機能の実装
まず、「settings.py」の確認を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'front.apps.FrontConfig', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] |
デフォルトで問題ないのですが、「django.contrib.auth」、「django.contrib.auth.middleware.AuthenticationMiddleware」などで認証を行なっているのを確認します。
「settings.py」ではログインした後に飛ぶURLと、ログアウトした後に飛ぶURLを設定できるので以下を設定しておきます。
1 2 3 4 |
LOGIN_REDIRECT_URL = '/' LOGOUT_REDIRECT_URL = '/' |
「settings.py」では最低限は上記の設定のみで大丈夫です。
マイグレーションとユーザー作成
DBは初期段階では必要なテーブルが作成されていないので以下のマイグレーションを実施します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$ python manage.py migrate System check identified some issues: WARNINGS: Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying sessions.0001_initial... OK |
また、上記でユーザー様のテーブルが作成され、認証ではUserオブジェクトを使いますが、そのユーザーの作成を行います
Userオブジェクトのデフォルトでの主要な属性では以下などがあります。
- username
- password
- first_name
- last_name
さて、ユーザーの作成を行います。
1 2 3 4 5 6 7 8 |
$ python manage.py createsuperuser ユーザー名 (leave blank to use 'vagrant'): test@foo.var メールアドレス: test@foo.var Password: Password (again): Superuser created successfully. |
上記がログインに必要なユーザーになります。
ルーティングの設定
さて、次にルーティングの設定として、「urls.py」の変更を行います。
上部で「django.contrib.auth」の読み込みを行なっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from django.contrib import admin from django.urls import include, path from django.contrib.auth import views as auth_views from django.views.generic import TemplateView urlpatterns = [ path('admin/', admin.site.urls), path('login/', auth_views.LoginView.as_view(template_name='job/login.html'), name='login'), path('logout/', auth_views.LogoutView.as_view(), name='logout'), path('job/', include('job.urls')), ] |
上記で、「login/」のパスでログインが実施できるようになりました。
また、logoutの機能もあわせて設定しています。
ログインページの作成
最後にログイン用のHTMLの作成を行います。
今回はとてもシンプルにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<html> <head></head> <body class="text-center"> <form class="form-signin" method="post">{% csrf_token %} {{ form.errors }} <h1>sign in</h1> <label>Email address</label> <br /> <input name="username"> <br /> <label>Password</label> <br /> <input type="password" name="password"> <br /> <button>Sign in</button> </form> </body> </html> |
ブラウザからは以下のURLなどでログインします。
http://localhost:8000/login/
これで先ほど作成したユーザーでログインの実施が可能になりました。
ユーザーがログインしているかの判別
ユーザーがログインしているかの判別は以下で行えます。
1 2 3 4 5 6 7 8 |
if request.user.is_authenticated: # Do something for authenticated users. ... else: # Do something for anonymous users. ... |
また、テンプレートでは以下のように判別します。
1 2 3 4 5 6 7 8 9 |
{% if user.is_authenticated %} <!-- Do something for authenticated users. --> ... {% else %} <!-- Do something for anonymous users. --> ... {% endif %} |
認証としてはこちらで基本的な部分は完了となります。
実際にはサインアップもありませんし、Userオブジェクトなどのモデルをどうするかなどアプリ作成時には諸々検討すべき項目がありますが、シンプルな形でのログインは上記までで。
★参考URL
https://leben.mobi/blog/django_login/python/
https://qiita.com/toku-hiro/items/3dce62615291fcb171a6
このブログは株式会社CoLabMixによる技術ブログです。
GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。
Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。
開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。