1. ホーム
  2. django

[解決済み] POSTメソッドは常に403 Forbiddenを返します。

2022-02-14 08:21:42

質問

私は、以下の本を読みました。 Django - CSRF 検証に失敗しました と、djangoとPOSTメソッドに関連するいくつかの質問(と回答)。私にとってベストだがうまくいかない答えの一つは https://stackoverflow.com/a/4707639/755319

承認された回答はすべて、少なくとも3つのことを示唆しています。

  1. render_to_response_callの3番目のパラメータとしてRequestContextを使用します。
  2. POSTメソッドを持つすべてのフォームに{% csrf_token %}を追加する。
  3. settings.pyのMIDDLEWARE_CLASSESを確認します。

提案されたとおりにしましたが、まだエラーは出ています。私は、django 1.3.1 (ubuntu 12.04 リポジトリより) と python 2.7 (ubuntuのデフォルト) を使用しています。

これは私のViewです。

# Create your views here.
from django.template import RequestContext
from django.http import HttpResponse
from django.shortcuts import render_to_response
from models import BookModel

def index(request):
    return HttpResponse('Welcome to the library')

def search_form(request):
    return render_to_response('library/search_form.html')

def search(request):
    if request.method=='POST':
        if 'q' in request.POST:
            q=request.POST['q']
            bookModel = BookModel.objects.filter(title__icontains=q)
            result = {'books' : bookModel,}
            return render_to_response('library/search.html', result, context_instance=RequestContext(request))
        else:
            return search_form(request)
    else:
        return search_form(request)

で、これが私のテンプレート(search_form.html)です。

{% extends "base.html" %}
{% block content %}
<form action="/library/search/" method="post">
    {% csrf_token %} 
    <input type="text" name="q">
    <input type="submit" value="Search">
</form>
{% endblock %}

サーバーを再起動しましたが、CSRFの検証に失敗したことを伝える403 forbiddenエラーはまだ残っています。

2つ質問があります。

  1. このエラーを修正する方法を教えてください。
  2. djangoで"POST"を作るのはなぜそんなに難しいのですか、つまり、そんなに冗長にする特別な理由があるのですか(私はPHPから来たのですが、以前にこのような問題を見つけたことはありません)?

解決方法は?

search_form ビューの render_to_response に RequestContext を入れてみてください。

context_instance=RequestContext(request)