いままで,FlaskやDjangoでログイン画面を実装する際には,入力された値(ユーザー名やパスワード)をデータベースに問い合わせし,一致したらログイン成功,不一致の場合ログイン失敗という処理をわざわざベタベタにコードで書いていたのだが,実はDjangoではログイン処理をAPI一発で呼び出せるらしい。
今回はそんなお話。覚えれば非常に便利,楽です。
ログインアプリケーションの作成
まずは,ログイン用のアプリケーションを作成しておきます。
$ python3 manage.py startapp accounts
ログイン/ログアウトの処理はこちらのアプリーケーション内に記述します。
(どのサイトもアプリ名がaccounts
だったのでそれに合わせ込み,アプリ名はaccounts
として作成。)
ディレクトリ構成
今回の構成を以下のようにします。
├── TestSite
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── accounts
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ ├── models.py
│ ├── templates #追加①
│ │ └── accounts
│ │ ├── home.html
│ │ └── login.html
│ ├── tests.py
│ ├── urls.py #追加②
│ └── views.py
├── その他のアプリケーション...
├── db.sqlite3
└── manage.py
templates
ディレクトリの追加- その下に
accounts
ディレクトリを作成し,ログイン関係のhtmlファイルをここに格納しておきます。
- その下に
urls.py
の作成- レンダリング情報を記述します。(後ほど説明します。)
URLレンダリングの設定
毎度のことながら,settings.py
とurls.py
(プロジェクト内の方)の記述/追記を行っていきます。
settings.py
にはINSTALLED_APPS
にaccounts.apps.AccountsConfig
を追加です。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp.apps.MyappConfig',
'accounts.apps.AccountsConfig', #追加
]
プロジェクト配下のurls.py
にはaccounts
のpathを通しておきます。
urlpatterns = [
path('admin/', admin.site.urls),
path('accounts/', include('accounts.urls')), #追加
]
アプリ配下のurls.py
にはログイン/ログアウトそして,ログイン成功時のホーム画面へののレンダリングを記述します。
from django.conf.urls import url
from django.contrib.auth import views as auth_views
from . import views
from django.urls import path, include
app_name = 'accounts'
urlpatterns = [
path('login/', auth_views.LoginView.as_view(template_name='accounts/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
path('home/', views.home, name="home"),
]
auth_views.LoginView.as_view()
としてDjangoのログイン用APIを使っていきます。ログアウトも同じです。
引数のtemplate_name
でログインURL時に返すHTMLファイルを指定します。これで,独自のHTMLを用いたログイン画面の開発が可能となります。
views.pyの記述
本来urls.py
で記述したURLレンダリング時の処理をviews.py
に記述を行うのですが,ログイン/ログアウトのAPIを用いた場合はこの記述が必要ありません。
ここでは,ログイン成功時に遷移するHOME画面の設定だけしておきます。
(home.html
を返すだけにしておきます。)
def home(request):
return render(request, 'accounts/home.html')
ログイン画面の実装
独自のログイン画面をHTMLで作成していきます。
今回は以下のようにしてみました。
<!DOCTYPE html>
<html lang="ja" dir="ltr">
<head>
<meta charset="utf-8">
<title>ログイン画面</title>
</head>
<body>
<h1>ログイン画面</h1>
<form action='' method='POST'>
{% csrf_token %}
{{ form.as_p }}
<button>ログイン</button>
</form>
</body>
</html>
{% csrf_token %}
の記述を忘れずに。
ポイントは{{ form.as_p }}
の記述です。DjangoのログインAPIを用いた場合は,この書き方でログインフォームを自動で作成してくれます。
オシャレな感じではありませんが...。CSSやBootstrapなりで今後オシャレにしていきます...。
このフォーム内にSuperuserで作成したアカウント情報を入力することで,
ログイン可能となります。
Superuserの作成は以下のコマンドで(未作成の方は)
$ python3 manage.py createsuperuser
- Username: 空白だとデフォルトのユーザー名となります。
- E_mail: 入力しなくても構いません。(エンターキーでスキップ可)
- Password: 必ず入力しましょう。(2回入力を行います)
ログイン後のページ遷移
ログイン後にレンダリングしたいページの設定はsettings.py
で行います。
最後に追記しておきましょう。今回はログイン成功時にHOME画面に遷移するようにしておきます。
LOGIN_REDIRECT_URL = '/accounts/home'
では,遷移されるホーム画面を適当に作っておきましょう。
<!DOCTYPE html>
<html lang="ja" dir="ltr">
<head>
<meta charset="utf-8">
<title>ホーム画面</title>
</head>
<body>
<h1>HOME画面</h1>
{% if user.is_authenticated %}
<p>{{ user.get_username }}でログイン中</p>
<a href="/accounts/logout">ログアウトする</a>
{% else %}
<p>ログインしていません</p>
{% endif %}
</body>
</html>
ログイン成功後は「<ユーザ名>でログイン中」という文言が表示されます。
ログイン状態でのみホーム画面へ遷移
どのサービスもログインをしていない状態では個人ページへの遷移はできないはずです。しかし今のままでは/accounts/home
とURLを直でブラウザへ入力するとホーム画面へ遷移できてしまいます。
そこで,ログインしていない場合はホーム画面へは遷移させない作りに変えていきます。...といってもたった2行の追加ですが。
views.py
に追記します。
from django.contrib.auth.decorators import login_required #追加① 新たにimport
@login_required #追加②
#これ以降の記述はログインしないと処理されません。
def home(request):
return render(request, 'accounts/home.html')
ログインユーザーにしか見せたくない記述は@login_required
より下に処理を書いておきます。たったこれだけです。
/accounts/home
にログインしていない状態で進むと,見事にログイン画面に強制的に遷移させられました。
これで,一通りDjangoのAPIを使った自作ログイン画面の構築は完了です。
次はログインページにCSSを使いオシャレにしていきます。
CSS/JavaScriptの導入は以下のページで
Djangoについて学びたい方へ
書籍で学びたいなら
DjangoのWebアプリの設計・作成はもちろん、Webサーバー・アプリ周りの知識も幅広く扱ってくれています。データベースの知識、クラウドの知識、セキュリティの知識も同時に習得でき、初心者にはぜひおすすめの書籍
Djangoについて深く知りたいという方におすすめしています。
ややプログラミングの知識がないと理解が難しいかもしれません。
pythonが書ける方には非常にタメになるDjangoアプリ開発におすすめ書籍でした。
オンライン授業で学びたいなら
僕はオンラインスクールはUdemy をおすすめします。定番の授業からマニアックな授業まで幅広く扱っているので、学びたいことは大体あります。今回はPython+Djangoの授業をおすすめします。Djangoの基礎から応用までこの授業で学べます。
実際にWEBアプリを作成し、公開するところまで親切に教えてくれます。
【徹底的に解説!】Djangoの基礎をマスターして、3つのアプリを作ろう!
コメント