Вход в 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, но обычно все заботятся о вас.

  1. Проверьте куки вашего браузера, чтобы увидеть, есть ли токен csrf
  2. Попробуйте очистить куки и обновить
  3. Убедитесь, что у вас есть промежуточное программное обеспечение django.middleware.csrf.CsrfViewMiddleware
  4. Убедитесь, что вы используете 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 ?)

Благодарю вас.