web-dev-qa-db-ja.com

CSRFトークンが見つからないか正しくない

Djangoここで、これを長い間修正しようとしています。ミドルウェアクラスに「Django.middleware.csrf.CsrfViewMiddleware」があり、トークンがあります。私の投稿フォームで。

ここに私のコードがありますが、何が間違っていますか?

from Django.contrib.auth.forms import UserCreationForm
from Django.shortcuts import render_to_response
from Django.http import HttpResponseRedirect
from chartsey.authentication.forms import RegistrationForm
from Django.template import RequestContext
from Django.core.context_processors import csrf

def register(request):

    if request.method == 'POST':
        c = RequestContext(request.POST, {})
        form = RegistrationForm(c)
        if form.is_valid():
            new_user = form.save()
            return HttpResponseRedirect("/")
    else:
        form = RegistrationForm()

    return render_to_response("register.html",  {'form': form,  }, )

これが私のテンプレートです:

{% block content %}

    <h1>Register</h1>
    <form action="" method="POST"> {% csrf_token %}
        {{ form.as_p }}
    <input type="submit" value="Submit">
    </form>

{% endblock %}
18
aroooo

更新:この回答は2011年からです。CSRFは今日簡単です。

最近では、renderショートカット関数return render(request, 'template.html')を使用する必要があります。この関数はRequestContextを自動的に使用するため、以下のアドバイスは8年ほど古いものです。

  1. renderを使用 https://docs.djangoproject.com/en/2.2/topics/http/shortcuts/
  2. CSRFミドルウェアの追加 https://docs.djangoproject.com/en/2.2/ref/csrf/
  3. 使用 {% csrf_token %}テンプレートタグ
  4. CSRFトークン値が生成され、フォームリクエストで送信されることを確認します。

元の応答

私の推測では、テンプレートにはタグがありますが、何もレンダリングしていません(または実際のHTMLでCSRFトークンが生成されていることを確認したということですか?)

辞書の代わりにRequestContextを使用する

render_to_response("foo.html", RequestContext(request, {}))

または、Django.core.context_processors.csrfあなたのCONTEXT_PROCESSORS設定。

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

またはトークンを手動でコンテキストに追加

23

これをビューに追加するだけです

return render_to_response("register.html", {'form': form, }, context_instance = RequestContext(request))

それが動作します!!

6
Njogu Mbau

render_to_responseの代わりにrenderを使用してみてください:

from Django.shortcuts import render

render(request, "foo.html", {})

Django-render()、render_to_response()、direct_to_template()の違いは何ですか?

上記のリンクで述べたように、それはDjango 1.3で導入され、自動的にRequestContextを使用します

4
Kamen Tsvetkov

RequestContextの追加は、@ Yuji 'Tomita' Tomitaと@Njogu Mbauが言及したように、render_to_responseを使用する際のキーです。ただし、この問題に苦労して最初に私を驚かせたのは、テンプレートを最初にロードするviews.pyの関数と、テンプレートからの送信を処理するviews.pyの関数の両方にRequestContextを追加する必要があったことです。

また、参考のために、この同じ問題を説明する他のリンクをいくつか紹介します

0
wingr

CsrfViewMiddlewareを使用していない場合は、csrf_tokenテンプレートタグを使用するすべてのビュー、およびPOSTデータを受け入れるビューでcsrf_protectを使用する必要があります。

0
Neeraj Sharma

Django-livereload-serverをインストールした後、一部のページでこのエラーがランダムに発生しました。 Django-livereload-serverをアンインストールするとうまくいきました。

0
lukeaus