こんにちは。相変わらず暑い日が続きますね。お盆休みということで更新をお休みしていましたが、再開します。

さて今日はDjangoで、ユーザー認証を行う方法について書いておきます。 注:Djangoはv1.6です

 

Samples@GitHub

  • 編集前のプロジェクト:before
  • 編集後のプロジェクト:after

 

特定ページアクセス時にユーザー認証を求めるように設定する

特定のページにユーザー認証保護をかけます。Djangoにはユーザー認証用のツールが用意されています。settings.pyのINSTALLED_APPSにデフォルトでは次のアプリが含まれているはずなので、有無を確認しておきます。

'django.contrib.auth'

もし無ければ追記すればOKです。

 

トップページにユーザー認証保護をかける

まずは、トップページにユーザー認証保護をかけてみます。下記4ファイルを記述していきます。

 

settings.py

ログインURLを指定する1行を追加します。

urls.py

ログインURLを、urlpatternsに追加します。また、myapp.views.index.pageを開くときにユーザー認証を求めるよう設定します。

login.py

myapp/view/login.pyを新規作成して、ログイン処理を記述します。

login.html

ユーザー名とパスワード入力を求める画面を表示するテンプレートです。

 

 

ここまで実装してからサーバーを実行し、http://127.0.0.1:8000にアクセスすると、自動的に/login/にリダイレクトされてユーザー認証を求める画面が表示されます。

 

login_form

 

South実行時に入力したユーザー名&パスワードを入力すれば、トップページが表示されます。

 

 

ログアウト機能を実装する

続いてログアウト処理を実装します。下記4点を実装します。

urls.py

ログアウトURLを追加します。

login.py

myapp/view/loout.pyを新規作成して、ログアウト処理を記述します。

login.html

ログアウト処理が成功した後で表示する画面のテンプレートです。

index.html

ログイン・ログアウトへのリンクを追加します。

 

 

 

ユーザー追加機能を実装する

続いてユーザー追加機能を実装してみます。上で作成したサンプルを改変してトップページにかけた認証保護を外します。トップページには

  • ログイン
  • ログアウト
  • ユーザー追加

の3メニューを表示します。ユーザー追加ページにはユーザー認証を求めるようにし、つまり既存のログインユーザーが新たなユーザーを作成できるような仕様にしてみます。

 

ここではユーザー認証の要否を判断する方法を変更してみました。

最初に使った方法はurls.pyのurlパターンを次のように記述することで実現していました。login_required()でテンプレート呼び出し関数を囲んで書く方法です。

url(r'^$', login_required(TemplateView.as_view(template_name='jp/index.html')), name="index"),

 

でも、ユーザー認証を求めるページが増えると面倒ですよね。もっとお手軽に書く方法があります。viewファイルのdef直前に下記1行を追加します。

@login_required

 

同様に、他のページに認証をかける場合も@login_requiredを挿入すれば認証機能が働きます。すなわち、ログアウト時に該当ページにアクセスすると、ログインページに自動的にリダイレクトされるようになります。

 

ちょっと長いエントリーになりましたが、今日は以上です!