web-dev-qa-db-ja.com

Django-CSRFトークンがないか正しくない

Djangoを1.4に更新しました。しかし、ログインフォームを送信しようとすると、次のエラーが発生します。

禁止(403)CSRF検証に失敗しました。リクエストは中止されました。失敗の理由:CSRFトークンが欠落しているか正しくありません。

私のsettings.py(MIDDLEWARE_CLASSES)では、非推奨になったため、次の行を削除する必要がありました。

'Django.middleware.csrf.CsrfResponseMiddleware',

そして、私がこのエラーを受け取り始めたよりも。

いくつかの必要な情報:Urls.py

url(r'^login/$', 'Django.contrib.auth.views.login', {'template_name': 'registration/login.html'}, name='login')
MIDDLEWARE_CLASSES = (
    'Django.middleware.gzip.GZipMiddleware',
    'Django.middleware.common.CommonMiddleware',
    'Django.contrib.sessions.middleware.SessionMiddleware',
    'Django.middleware.csrf.CsrfViewMiddleware',
    'Django.contrib.auth.middleware.AuthenticationMiddleware',
    'Django.contrib.messages.middleware.MessageMiddleware',
#   'Django.middleware.csrf.CsrfResponseMiddleware',
    'Django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
)

login.html

{% extends "base.html" %}
{% block title %} Login {% endblock %}
{% block content %}



   <div id="text">
        <table>
          <form action="" method="post">
          {% csrf_token %}
            <tr>
                <td><label for="username">Email:</label></td>
                <td><input type="text" name="username" value="" id="username"></td>
            </tr>
            <tr>
                <td><label for="password">Password:</label></td>
                <td><input type="password" name="password" value="" id="password"></td>
            </tr>
            <tr>
                <td><input type="submit" value="Login" />
            {% if next %}
                <input type="hidden" name="next" value="{{ next }}" /></td>
            {% else %}
                <input type="hidden" name="next" value="/" /></td>
            {% endif %}
            </tr>
          </form>
        </table>


      {% if form.errors %}
        <p class="error">User or password incorrect</p>
      {% endif %}
    </div>
{% endblock %}

誰かがこの問題を解決する方法を知っていますか?

13
Thomas

コードは正常に見えます。Django 1.3および1.4auth.views.loginはRequestContextを正しく使用しています。以下を確認してください。

  • まずブラウザのデータを消去して、再試行してください
  • 提出されたcsrfmiddlewaretokenの価値は何ですか
  • 正しいDjangoをインポートしますか?
  • コンソールにUserWarningがありますか?:「テンプレートで{%csrf_token%}が使用されましたが、コンテキストが値を提供しませんでした。これは通常、RequestContextを使用していないことが原因です。」
8
okm
  1. 1.3および1.4の場合、「Django.middleware.csrf.CsrfResponseMiddleware」には「Django.middleware.csrf.CsrfViewMiddleware」という名前を付ける必要があります。
  2. また、私にとっては、GoogleChromeのCookieをクリアすることで機能しました。
3
Jason Adleberg

アプリがHTTPSにデプロイされた場合にも同様の問題が発生しました。クライアントサーバーがcsrfcookieにアクセスできるように、設定フラグCSRF_COOKIE_HTTPONLYをfalseに変更する必要がありました。

0
webbyfox