vagrantでdjangoでユーザ認証

ユーザ認証して、認証後のユーザ利用まで動作できたのでまとめる。
できたけど、フレームワークが提供してくれてるがいろいろ面倒くさい。
djangoって結構自前で作る部分が多いかと思うので、フレームワークがやってくれるのか、そこは自前なの?!、とかが分からなくてしんどかった。

Djangoのユーザ認証まとめ | c-bata web

とはいえユーザ認証する部分は上記サイトをまるまる参考にさせていただきました。
せいぜいurls.pyの書き方が違うくらい。

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^login/$', 'django.contrib.auth.views.login',
        {'template_name': 'account/login.html'}),
    url(r'^logout/$', 'django.contrib.auth.views.logout',
        {'template_name': 'account/logout.html'}),
    url(r'^account/', include('account.urls', namespace='account')),
]

ユーザ認証を別のアプリケーションから利用するところが今回の記事のメインなんだけど、モデルを起こすところも、c-bata webさんの記事を参考にさせてもらいました。しかし、差分だけ書くと作業の流れがわかりにくいので丸々書く。

アプリケーションをこさえる。todoを残すだけのアプリ。

$ python manage.py startapp todo

setting.pyのINSTALLED_APPSにtodoを追加。

+++ b/django_auth/settings.py
@@ -38,6 +38,7 @@ INSTALLED_APPS = (
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'account',
+    'todo',
 )

urls.pyにルーティングを追加。

+++ b/django_auth/urls.py
@@ -23,5 +23,6 @@ urlpatterns = [
     url(r'^logout/$', 'django.contrib.auth.views.logout',
         {'template_name': 'account/logout.html'}),
     url(r'^account/', include('account.urls', namespace='account')),
+    url(r'^todo/', include('todo.urls')),
 ]

モデルを定義。外部キーとしてdjangoのUserモデルを指定。

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Todo(models.Model):
    user = models.ForeignKey(User, related_name='todo')
    memo = models.CharField('Memo', max_length=128)

admin.py。

from django.contrib import admin
from todo.models import Todo

# Register your models here.

admin.site.register(Todo)

todo/urls.pyはフレームワーク生成ではなく、自分で作成。表示のみ。更新はadminからやる。

from django.conf.urls import url
from django.contrib.auth.decorators import login_required
from django.views.generic import TemplateView
from . import views

urlpatterns = [
    url(r'^$', login_required(views.IndexView.as_view(
               template_name='todo/index.html')), name="index"),
]

views.py。何をこんなにimportしなきゃいかんのか分かってないけど、やる。しょうがない。まだdjangoはチュートリアルと、これしか作ってないし。

from django.shortcuts import render
from django.core.urlresolvers import reverse
from django.views import generic
from django.http import HttpResponseRedirect, HttpResponse, Http404
from django.template import RequestContext, loader
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from .models import Todo

# Create your views here.
class IndexView(generic.ListView):
    template_name = 'todo/index.html'
    context_object_name = 'todo_list'

    def get_queryset(self):
        # reffer django-document.
        # Built-in class-based generic views > Dynamic.filtering
        # print(self.request.user)
        return Todo.objects.filter(user_id = self.request.user.id)

テンプレートの追加。ディレクトリ構成が気持ち悪いけど、他の書き方がよく分からない。

% mkdir -p todo/templates/todo/
% touch todo/templates/todo/index.html
▽
<p>{{ user.username }}</p>

{% if todo_list %}
    <ul>
        {% for todo in todo_list %}
            <li>{{ todo.memo }}</li>
        {% endfor %}
    </ul>
{% else %}
    <p>No item are available.</p>
{% endif %}

あとはDBを更新すれば出来上がり。

% python manage.py makemigrations
% python manage.py migrate

出来上がったのはこれ。ログイン後にhttp://127.0.0.1:8080/todoとかでアクセスすれば、adminで追加したメモがUser毎に表示されるハズ。
https://github.com/vottie/django_auth

苦労したのはtodoのviews.pyでどうやればUserを利用できるか、だった。
結果Userモデルをimportしてあげることで解決できた。
もう1点はListViewでどうやればログインしたUserがGETできるかだったが、ドキュメントをしらみつぶしに読んでいったらUserはRequestオブジェクトに入っていることが分かって、ListViewのselfはrequestオブジェクトを含むことが分かって解決した。

最後に今回の環境は以下。
vagrant
ubuntu14.04
python 3.4.3(pyevn)
django 1.8

Comments on this post

No comments.

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Trackbacks and Pingbacks on this post

No trackbacks.

TrackBack URL