ユーザー認証をやってみる

Djangoでユーザー登録

ユーザー登録で良くあるパターンとして

  • ユーザーネームとパスワード、メールアドレスを入力する
  • 認証のメールが届く
  • メールに書いてあるURLにアクセスするとアカウントが有効になる

という処理が良くあります。
これをやるためのモジュール(テンプレート?)が
実は用意されています。
django-registration - Google Code
これを使ってみましょう

django-registrationをインストールしてみる

さっそく先ほどのdjango-registrationのサイトの右の方の
「Featured Downloads:」からダウンロードして解凍します。
そして解凍したディレクトリで

>sudo python setup.py install

をするだけでインストール終了です。

django-registrationをプロジェクトに取り込む

まずはプロジェクトの settings.py のINSTALLED_APPSに
registrationを追加します。
ちなみにdjango.contrib.humanizeも使用しますので
一緒に追加しましょう。
例:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.admin',
    'django.contrib.humanize',
    'registration',
)


次に期限を決めます。
これもsettings.pyに下記を追加します

ACCOUNT_ACTIVATION_DAYS=7  #7日間有効


後はメールサーバの設定をします。
これはアプリケーションの動いてるサーバで
smtpが動いていれば特に必要ありませんが
無い場合、色々めんどくさいと思いますので
Gmailを使ってみようと思います。
これもsettings.pyに書き込みます

# use Gmail                                                                                                                                                                       
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'youremail@gmail.com'
EMAIL_HOST_PASSWORD = 'yourpassword'
EMAIL_PORT = 587


次にURLの設定をします。
urls.pyに下記を追加します

urlpatterns = patterns('',                                                                                                                                              
    (r'^admin/', include('django.contrib.admin.urls')),
    (r'^accounts/', include('registration.urls')),  # ←これ
)

ここまでで大体準備は完了です。

テンプレートを準備する

ダウンロードしてきたファイルの中に
registration/templates/registration
というディレクトリがあります。
このregistrationを自分のプロジェクトのテンプレートの場所にコピーします。

  • templates/
    • registration/
      • activate.html
      • activation_email.txt
      • login.html
      • logout.html
      • registration_complete.html
      • registration_form.html

こんな構成になると思います。


次にtemplatesのしたにbase.htmlを作成します。
例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
   <title>{% block title %}Title{% endblock %}</title>
</head>
<body>
{% block content_header %}Log in{% endblock %}
{% block main_content %}
Main
{% endblock %}
{% block sidebar %}
<p>If you don't have an account, you can <a href="{% url registration_register %}">sign up</a> for one; it's free, and you'll get access to a bunch of nifty features.</p>
{% endblock %}
</body>


ここまで来たらもう少しです。
registrationのしたにactivation_email_subject.txtというファイルを作成します。
これがメールのタイトルになります。
例:

ようこそ{{ site.name }}へ

以上で準備完了です。

実際に動かしてみる

まず

>python manage.py syncdb

を実行して必要なテーブルを作成しましょう。


その後、開発用サーバを起動します。

>python manage.py runserver 


ここで、注意点です。
認証メールにはデータベース上にあるsiteの情報が使用されますので
adminからログインしsiteのデータを変更しておきましょう。
俺はドメインを「localhost:8000/」
表示名を「テストサイト」にしました。
どうやらこの情報は起動時に読み込まれているようなので
一度、開発サーバを再起動しておきましょう。

実際に使ってみる

早速、http://localhost:8000/accounts/register/ にアクセスしてみましょう。
ユーザー登録ベージが表示されると思います。
一通り動かしてみましょう。


今回もほとんどプログラムらしいことを何も書かずに完成してしまいました。


今後はaccounts/profile/ ページを作成するなど
ドンドン弄ってみましょう。

ユーザー認証のみのプロジェクトをDjangoで作ってみました。
サンプル程度には使えるかと思いますので
よかったら使ってみてください
http://yoshiori.org/misc/django/sample.20081001.tar.gz

やっぱり出てくる文字コードの問題

ただし、ひとつだけ問題点があります。
メールの文字コードです。
utf-8で送られますので現在のモダンなメーラでは
問題ありませんが携帯などで問題が発生します。
この辺はやはり根が深いようなので
興味のある方はどうぞ
Django-ja (at Lingr) > Archives > September 30, 2007