vagrantでdjangoでユーザ認証
ユーザ認証して、認証後のユーザ利用まで動作できたのでまとめる。
できたけど、フレームワークが提供してくれてるがいろいろ面倒くさい。
djangoって結構自前で作る部分が多いかと思うので、フレームワークがやってくれるのか、そこは自前なの?!、とかが分からなくてしんどかった。
とはいえユーザ認証する部分は上記サイトをまるまる参考にさせていただきました。
せいぜい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
Trackbacks and Pingbacks on this post
No trackbacks.
- TrackBack URL
Comments on this post