Ошибка CSRF cookie после обновления Django 3.2 (DRF с аутентификацией токенами)

Я хотел обновить бэкенд моего приложения с Django 3.1.14 (работает нормально, но больше не поддерживается) на более новую версию (я пробовал и 3.2, и 4.0), но после обновления я начал получать ошибку CSRF cookie.

Запрещено (CSRF cookie не установлен.): /api-token-auth/

.

Кто-нибудь случайно знает, что изменилось в Django в отношении CSRF, и как избежать ошибок?

У меня сложилось впечатление, что CSRF не применяется при использовании Django Rest Framework с аутентификацией по токенам. Я все равно пытался удалить промежуточное ПО 'django.middleware.csrf.CsrfViewMiddleware', добавить @csrf_exempt во все представления, удалил все существующие токены и вышел из админки Django, но безрезультатно. Моя конфигурация DRF в settings.py выглядит следующим образом:

INSTALLED_APPS = [
    'rest_framework',
    'rest_framework.authtoken',
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
}

Проблемой был порядок urlpatterns в urls.py. Этот ответ помог.

Если url администратора Django находится выше urls api, любой api запрос даже не достигнет этих api и Django выдаст ошибку CSRF cookie.

Работает в Django 3.1, но не работает в Django 3.2:

urlpatterns = [
    path('', admin.site.urls),
    url(r'^api-token-auth/', views.MyLoginToken.as_view()),
    url(r'^', include('myapp.backend.urls')),
]

Работа в Django 3.2:

urlpatterns = [
    url(r'^', include('myapp.backend.urls')),  # move CSRF exempt apis to the top
    url(r'^api-token-auth/', views.MyLoginToken.as_view()),
    path('', admin.site.urls),  # move CSRF protected endpoints to the end
]

Я не смог найти никакой документации по этому изменению с Django 3.1 на Django 3.2.

Вернуться на верх