Hatena::ブログ(Diary)

Debian GNU/Linux 3.1 on PowerMac G4 このページをアンテナに追加 RSSフィード Twitter

2012-04-11 Django1.4にしたらCSRFでFailedするようになったので修正した

今まで Django 1.3.1 で使っていたアプリケーション、Django が 1.4 になったからとりあえず動作確認をしてみたら、フォームの送信で「CSRF verification failed. Request aborted.」となってしまった…。


というわけで、結局は自分のコードがダメダメだったのでメモ。

[]RequestContextを使いなさい! 08:32 RequestContextを使いなさい!を含むブックマーク RequestContextを使いなさい!のブックマークコメント

今まで動いていた Django 1.3.1 での settings.py の Middleware の部分はこんな感じ。

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.csrf.CsrfResponseMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

確か「django.middleware.csrf.CsrfResponseMiddleware」を自分で加えてる。


コードはこんな感じ。

 return render_to_response('mapitems/confirm.html', {'form':form, 'mapitem':mp})

で、confirm.html の form の部分には「{% csrf_token %}」がちゃんと入ってる。


このコードと html を Django 1.4 の環境にそのままコピーして、Middleware の件は忘れて何もせずに動作させてみた。

結果、フォームの送信で「CSRF verification failed. Request aborted.」となってしまった…。

f:id:paraches:20120411080543p:image

反射的に「あ、Middleware に何か加えてたっけ!」と思い出して、「django.middleware.csrf.CsrfResponseMiddleware」を MIDDLEWARE_CLASSES に加えて再度挑戦。

すると、今度は nginx がそんなページない!ってエラーを出すようになった…。

ググると django.middleware.csrf.CsrfResponseMiddleware は Django 1.4 では deprecated みたいなので、settings.py から削除。


で、結局は「CSRF verification failed. Request aborted.」のエラーページに出ている「The view function uses RequestContext for the template, instead of Context.」という部分が今回の原因。

コードの部分を下記のようにしたら問題なくなった!

return render_to_response('mapitems/confirm.html', context_instance=RequestContext(request, {'form':form, 'mapitem':mp}))

form のコードは何ヵ所かあるのだけど、なぜかこの部分だけが RequestContext 使ってなかった。


というわけで、ダメダメだった自分のコードも修正して、ちゃんと Django 1.4 でも動作するようになりました!


Pythonプロフェッショナルプログラミング

Pythonプロフェッショナルプログラミング

Django×Python (LLフレームワークBOOKS)

Django×Python (LLフレームワークBOOKS)