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 %}
Кто-нибудь знает, как решить эту проблему?
Ответы
Ответ 1
Код выглядит отлично, Django 1.3 и 1.4 auth.views.login правильно использует RequestContext. Пожалуйста, проверьте:
- Сначала очистите данные браузера и повторите попытку
- Какая ценность представленного csrfmiddlewaretoken
- Вы импортируете правильный Django?
- Просто убедитесь, что в консоли есть UserWarning:?: "{% csrf_token%} использовался в шаблоне, но контекст не предоставил значение. Обычно это вызвано не использованием RequestContext."
Ответ 2
- Для 1.3 и 1.4 "django.middleware.csrf.CsrfResponseMiddleware" следует называть "django.middleware.csrf.CsrfViewMiddleware"
- Кроме того, для меня удаление cookie Google Chrome заставило его работать.
Ответ 3
У меня была аналогичная проблема, когда мое приложение было развернуто на HTTPS. Мне пришлось изменить флаг установки CSRF_COOKIE_HTTPONLY на false, чтобы клиентский сервер мог получить доступ к csrf cookie.