Ошибка 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.