02

vagrantでdjangoでユーザ認証

ユーザ認証して、認証後のユーザ利用まで動作できたのでまとめる。 できたけど、フレームワークが提供してくれてるがいろいろ面倒くさい。 djangoって結構自前で作る部分が多いかと思うので、フレームワークがやってくれるのか、そこは自前なの?!、とかが分からなくてしんどかった。 Djangoのユーザ認証まとめ | c-bata web とはいえユーザ認証する部分は上記サイトをまるまる参考にさせていただきました。 せいぜいurls.pyの書き方が違うくらい。 ユーザ認証を別のアプリケーションから利用するところが今回の記事のメインなんだけど、モデルを起こすところも、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モデルを指定。 admin.py。 todo/urls.pyはフレームワーク生成ではなく、自分で作成。表示のみ。更新はadminからやる。 views.py。何をこんなにimportしなきゃいかんのか分かってないけど、やる。しょうがない。まだdjangoはチュートリアルと、これしか作ってないし。 テンプレートの追加。ディレクトリ構成が気持ち悪いけど、他の書き方がよく分からない。 % mkdir -p todo/templates/todo/ % touch todo/templates/todo/index.html あとは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

10

vagrantのport forward

djangoをvagrantにインストールしたのだけれど、runserverしてもホスト(この場合はmac)側のブラウザで管理画面が見えない。ポートフォワードの設定がおかしくなってる。 具体的にはguest:8000, host:28000で定義しているにもかかわらず、ホスト側からはlocalhost:18000でアクセスできてしまう。 ポートフォワードせずにvm上でw3mでアクセスするとguestのポートは8000であることは確実。 なぜにポートフォワードがトチ狂うのか?と思ってたが、vagrantのgunicornの設定で8000番を使ってて、かつ18000番にポートフォワードしてた。。。 vagrantでは28000番を使って、ホスト側は28001番のフォワード設定で解決した。と思いきや、ぜんぜんつながらない。 tcpdumpまでひっぱりだして3,4晩ウンウン唸ってたけど、”django vagrant”でググったら一発で解決した。   5分でできるVagrantでDjangoの環境構築 | qiita そういえばrailsか何かでハマったような気もする…  

16

pythonその6 django入門

ルーティングがうまく行かないなーと思って、和訳を眺めてたら衝撃の事実が… 自分の間違い:mysite/polls/urls.py を新規作成 正しくは:mysite/mysite/urls.py 既存ファイルにルール追加。 と思いきや1.4と1.8だとurls.pyの置き場が違うみたい。重要そうなファイルなので、公式ドキュメントの間違いなんじゃないか?と思い試行錯誤した結果、ようやくでけた。polls/urls.pyは新規作成で、mysite/urls.pyは修正。両方必要みたい。公式もよーく読むとそう書いてあった。ルーティング定義をしてるのに404 not foundで、定義したルールとエラーしたルールが違う時点で気づける人は気づけるんだろう。 railsと比較すると自分で書いてる分、コントロールできている気がすると思うし、どうせできてるといってもscaffoldだと実際には使えないしなーと思う反面、いちいち書くの面倒くさいなーとも思ったり。また、がちゃがちゃやってる間にいろんなエラーに出会った。 ImportError : from x import yの誤り SyntaxError : 括弧の数が合わない IndentationError : インデントが合わない NoReverseMatch : “XXXX is not a registered namespace”と詳細で出てる。どうもチュートリアルにあるnamespaceの指定が余計っぽい。 AttributeError : module’ object has no attribute ‘XXXX’ タイプミスを指摘された。 この辺のデバッグは慣れが必要だな… チュートリアルの4ではそれまでとガラっとviewの書き方が変わる。今回はローカルのgitにこまめにコミットしながらやってたので、ビクビクせずに学習できたが、classベースのviewに変えたら、最新5件をとってきてindexに表示するところが動かなくなったので、後で調べる。たぶん。 2015/08/29追記 classベースのviewでindex表示ができない原因はtypoだった。contextと書くはずが、conextになっていた。  

15

pythonその5 django

公式のチュートリアルに沿って学習中。runnserverのパラメタ指定とかufwに穴開けたりとかいろいろあったけど、書いてたのが消えたので、途中から。 returnの後にコード書いてる以下はなんなんだ? メソッドのdefの外だし、いつ実行されるんだろう? 検索するフィールドや過去何日間の記事に絞るとか、そういった機能は追加するのが直感的に分かって、やってて面白かったけど、データのリレーションの定義はrailsの方が優しいような気がした。チュートリアル2の最後はインストールしたファイルをいじるようなことを書いててやめた。日本語ドキュメントを読めば分かるかもしれないけど、負けたような気がするのでやめておく。   チュートリアル3のviewを追加したけど期待通りに動作しないところで、一旦ギブアップ。  

12

pythonその4 環境周りとdjangoインストール

ファイルの先頭行に何を書くのか? 直接実行したい時は以下を書くと良い。 具体的には直接実行しないクラスを書いたファイルには不要。 デフォルトエンコーディングは書いておいた方が良さそう。 rubyでのrbenvみたいなのは? わたしゃさくらのvpsにubuntu 14.04.02 LTSを入れて学習中。 なのですが、既に以下の状態。ここから実行環境の切り替えとかできるんだろうか… rubyのrbenvみたいなのは、direnvかpyenvらしい。virtualenvはその前みたい。誰かその辺の歴史みたいなのとかまとめてくれんかな。direnvはpythonもrubyもまとめて面倒みまっせ的なものみたいだけど、既にrbenvは導入済だし、今回はpyenvでやってみることにする。他の人のやり方を見つつ、以前にrbenv入れたのをhistoryで推測しながら以下を実行した。 なお、参考にさせていただいたのは以下でございます m(. .)m Ubuntu 12.04でpyenvを利用して速攻でPython3.4 + Nginx + uWSGI + FlaskなWebアプリケーション実行環境を作る (Qiita) Ubuntuにpyenvを用いてpythn環境を構築しました。(たくのこWeb) /usr/binにインストールされているpythonは置いといて、version 3.4.3をインストール。インストール前にdjangoとversionの整合性は確認した。インストールにはそこそこ時間かかる。何やらWARNINGが出てるが、気にしないったら気にしない。   rubyでいうところのgem(パッケージ管理)はpipだそうだ。pipは実行環境を先ほどインストールした3.4.3に切り替えたら入ってた。なのでdjangoをインストール。公式にある通りコマンド打ってみる。