[Django]403 Forbidden:CSRF verification failed. Request aborted.

Written by uechoco 3月 11
この記事を読む時間:115くらい

Django 3日目。手元の本はDjango 1.1を基本に書かれているのですが、私のローカル環境はDjango 1.2です。書籍には簡易ブログのチュートリアルがあるのですが、その通りにコードを入力すると以下のようなエラーになりました。

「403 Forbidden」
「CSRF verification failed. Request aborted.」

ぐぐったら、Django 1.2 CSRF verification failed – Joshua Gourneauというブログで、settings.pyのMIDDLEWARE_CLASSESに以下の2つを登録すると大丈夫と書いてありました。

  1. 'django.middleware.csrf.CsrfViewMiddleware',
  2.     'django.middleware.csrf.CsrfResponseMiddleware',

私のDjango 1.2.6では、1つ目のクラスは登録済みだったので、1行だけ追加しました。

無事、次の画面に進めました!

[python]だからrunserverなのか?[for phper]

Written by uechoco 3月 08
この記事を読む時間:457くらい

諸事情により、Pythonを始めて2日目です。もしかしたら諸事情もなくなるかもしれませんが、なくなるまで独習します。また、以下の記事はPHPerの私が書いているので、嘘8000かもしれませんが、ぱいそにゃー(Pythonista)の方の正しいツッコミが入れば修正したいと思います。(つまり、執筆時点の思い込みで書いています。)

さて、1日目は何をやったかはブログには書いていなかったのですが、「Python入門」という本をざっと眺め読みして、EclipseにPyDevを入れて、Apacheにmod_wsgiを入れてDjangoのWelcomeページを出していました。この時点ですでにPHPerとしての思い込みがあったのでしょう。書籍にはDjangoのmanage.pyのrunserverでWebサーバをいちいち立てて実行結果を表示する方法が書いてあったのですが、私はそれをスマートではないと勘違いして、mod_wsgi環境を構築し、VirtualHostを設定して、満足していました。

2日目。なにやらview.pyを使いしてindex関数を定義し、url定義をした上でHello Djangoという文字を表示するだけの至極簡単なプログラムが動きませんでした。というより、画面が変わりませんでした。もしかしたらと思い、apachectl gracefulしたらHello Djangoが表示されました。この結果から推測されるのは、Django(あるいはPython)のプログラムはWebサーバが再起動するまでプログラム(あるいはプログラムの一部が)再読込されないのでは?ということでした。Hello Worldだけで判断するのはいかがなものかと思いつつも、状況がそう示しているので相思うしかありません。

つまり現時点での結論は、runserverというのはApacheでごにょらなくても簡単に動作確認ができる便利ツールなどではなく、開発効率を考えた上で付属されている非常に重要なファクターなのだと、判断しました。P.S.:mod_wsgiの仕様でした

なんども言いますが、まぁ、勝手な思い込みです。むしろ、正しい!or間違っている!のどちらの声も歓迎です。Twitter経由でもかまいませんので突っ込んで欲しいです。Pythonェ…わからんw

P.S.(10分後):Djangoのドキュメントで答えと思わしき解説を見つけました。(Django のインストール — Django v1.1 documentation

単に Django を試してみたいだけなら、この節は読み飛ばして次の節を読んでくだ さい。Djangoにはテスト用の軽量なWebサーバが付属しているので、運用環境での動 作が必要になるまでApacheをセットアップする必要はないのです。

Django を実運用のサイトで使いたい場合、 Apache と mod_wsgi を使って下 さい。 mod_wsgi は mod_perl のようなもので、 Python を Apache の中に埋め 込み、サーバの起動時に Python コードをメモリにロードします。コードは Apache プロセスが生きている間ずっとメモリ上に存在するので、他のサーバ構成よりも明 らかに高いパフォーマンスを実現します。 Django は mod_wsgi をサポートする全 てのバージョンの Apache で動作します。

mod_wsgi をインストールした後の設定方法は mod_wsgi で Django を動かす を参照してく ださい。

何らかの理由で mod_wsgi を使えない場合でも心配はいりません: Django を運用す る方法は他にもあります。お勧めの第二選択肢は、 mod_wsgi の前身、 mod_python です。 Django は WSGI 仕様に従っているので、他にも様々なサーバプラットフォームで 動作させられます。個々のプラットフォームにおけるインストール方法の説明はサーバ構成に関する wiki ページ を参照してください。

私が想定していたのはmod_phpのように動的にコードを読み込むmod_pyhonでした。mod_wsgiは上記解説のとおり、Pythonコードをメモリにロードするため、Apacheプロセスを再起動しなければコードが変わらないわけですね。そういえば、phpはApacheならmod_phpの選択肢があまりにも有名しすぎてこんなことは疑わなかったです。モジュールが変われば実行形態も変わるのは当然ですね。まだまだ青いな俺。