Вход в django admin внезапно требует токена csrf
Я несколько минут назад вошел в консоль администратора django. Я, должно быть, кое-что изменил, что вызвало эту ошибку при входе в систему как суперпользователь:
Запрещено (403)
Не удалось выполнить проверку CSRF. Запрос прерван.
Эта ошибка застала меня на страже, когда я вошел всю ночь. Зачем мне вдруг нужен токен csrf для входа в систему? Вы могли бы подумать, что знак в форме уже имеет это. Это мой admin.py:
from django.contrib import admin
from accounts.models import Image, Category, UserProfile
class ImageAdmin(admin.ModelAdmin):
list_display = ["__unicode__", "title", "created"]
admin.site.register(Image, GenericImageAdmin)
class CategoryAdmin(admin.ModelAdmin):
list_display = ["category"]
admin.site.register(Category, CategoryAdmin)
admin.site.register(UserProfile)
Ответы
Ответ 1
Для входа в систему администратора обычно требуется токен csrf, но обычно все заботятся о вас.
- Проверьте куки вашего браузера, чтобы увидеть, есть ли токен csrf
- Попробуйте очистить куки и обновить
- Убедитесь, что у вас есть промежуточное программное обеспечение
django.middleware.csrf.CsrfViewMiddleware
- Убедитесь, что вы используете
https
или CSRF_COOKIE_SECURE=False
(по умолчанию), в противном случае ваш файл csrf существует, но не будет отправлен. CSRF_COOKIE_SECURE
куки после изменения CSRF_COOKIE_SECURE
.
Ответ 2
Добавьте токен csrf в свой контекст в окне входа в систему, а в вашем шаблоне добавьте скрытый div для токена csrf. Убедитесь, что у вас есть django.middleware.csrf.CsrfViewMiddleware в разделе промежуточного программного обеспечения в файле settings.py.
Затем добавьте @csrf_protect к вашим представлениям, чтобы сделать с логином. Также возможно, что вы попытались войти в систему с неправильными учетными данными - вам нужно @csrf_protect в представлении выхода из вашего приложения views.py вы вызываете соответствующий uri для входа/выхода из системы и т.д. В urls.py. Мой выход просто вызывает выход из системы (запрос), а затем вызывает HttpResponseRedirect (''), который, вероятно, не идеален, но теперь он мне подходит для моих нужд.
Ответ 3
Эта ошибка появлялась для меня, когда я не устанавливал CSRF_COOKIE_DOMAIN в моих настройках_local, но был установлен в моем основном файле settings.py.
В моем случае я установил его на локальный хост, например
CSRF_COOKIE_DOMAIN = '127.0.0.1'
Ответ 4
В качестве меры безопасности у меня было CSRF_COOKIE_SECURE = True
в моих настройках. Попытка войти в админ с помощью localhost, где нет HTTPS, была запрещена ошибка.
Установите его на False
, чтобы заставить его работать с localhost
Ответ 5
Это также может произойти, если вы уже вошли на свой сайт, размещенный на URL-адресе, отличном от администратора. Затем попробуйте войти в свою панель администратора на новой вкладке.
Попробуйте открыть панель администратора в другом окне.
Ответ 6
Отключение проверки CSRF сработало для меня. Я знаю, что это не так надежно, как извлечение промежуточного программного обеспечения CSRF из вашего проекта, но это сработало для меня.
Вот как я это сделал:
Шаг 1. Создайте новое приложение в своем проекте и назовите его middle (именно так я его и назвал) с помощью python manage.py startapp middle
Шаг 2. Откройте файл "apps.py" в новой папке приложения и внесите соответствующие изменения, чтобы код был примерно таким:
from django.apps import AppConfig
from django.utils.deprecation import MiddlewareMixin
class MiddleConfig(AppConfig):
name = 'middle'
class DisableCSRF(MiddlewareMixin):
def process_request(self, request):
setattr(request, '_dont_enforce_csrf_checks', True)
(Примечание: ваш первый вызов может отличаться в зависимости от того, как вы назвали свой проект)
Шаг 3. Удалите 'django.middleware.csrf.CsrfViewMiddleware'
django.middleware.csrf.CsrfViewMiddleware" из списка MIDDLEWARE вашего файла settings.py в каталоге вашего проекта и добавьте еще одну запись в список MIDDLEWARE: 'middle.apps.DisableCSRF'
(Примечание: используйте новое имя приложения вместо середины, если вы назвали новое приложение с другим именем)
Список MIDDLEWARE в вашем файле settings.py должен выглядеть примерно так:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'middle.apps.DisableCSRF',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
Я надеюсь, что это работает и для вас, ребята.
(см. этот пост для получения дополнительной информации об отключении проверки CSRF в django: как отключить проверку CSRF в Django ?)
Благодарю вас.