Django 3.2 更新后的 CSRF cookie 错误(DRF with token authentication)

CSRF cookie error after Django 3.2 update (DRF with token authentication)

我想将我的应用程序后端从 Django 3.1.14(工作正常但不再受支持)更新到更新的版本(我尝试了 3.2 和 4.0),但更新后我开始收到 CSRF cookie 错误。

Forbidden (CSRF cookie not set.): /api-token-auth/

有没有人知道 Django 在 CSRF 方面发生了什么变化,以及如何避免这些错误?

我的印象是在使用带有令牌身份验证的 Django Rest Framework 时未强制执行 CSRF。无论如何,我尝试删除 'django.middleware.csrf.CsrfViewMiddleware' 中间件,将 @csrf_exempt 添加到所有视图,删除所有现有令牌并注销 Django 管理员,但无济于事。我在settings.py的DRF配置如下:

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

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

编辑:下面是我自己的回答

urls.py 中的 urlpatterns 顺序是问题所在。 This 回答有帮助。

如果 Django 管理员 url 在 api url 之上,任何 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 的重大更改的文档。