Django / React Cross-Origin Request Blocked Error 托管 Google App Engine django-cors-headers 不工作

Posted

技术标签:

【中文标题】Django / React Cross-Origin Request Blocked Error 托管 Google App Engine django-cors-headers 不工作【英文标题】:Django / React Cross-Origin Request Blocked Error hosted Google App Engine django-cors-headers not working 【发布时间】:2020-06-11 17:52:33 【问题描述】:

应用程序后端 (django) 和前端 (react) 托管在同一应用程序的谷歌云上。 我已经安装了 django-cors-headers 并在 settings.py 中引用了它:

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
]

CORS_ORIGIN_ALLOW_ALL = True

CORS_ORIGIN_REGEX_WHITELIST = (
    'http://localhost:3000',
    'https?\://myapp\.appspot\.com\/?',
    'https?\://frontend-dot-myapp\.appspot\.com\/?',
)

据我所知,CORS_ORIGIN_ALLOW_ALL 应该已经解决了这个问题,但它没有,我只是有点绝望在那里尝试。 CORS_ORIGIN_WHITELIST 对我来说效果不佳,这就是 CORS_ORIGIN_REGEX_WHITELIST 的原因。

我没有更改此设置中的任何内容,但现在出现了跨域错误。自上次代码更改以来,我安装了 django-silk 来分析应用程序。删除它似乎无法解决问题,所以我不确定它是否相关。

帮助不胜感激!

在 requirements.txt 中: django-cors-headers==3.2.1

编辑

经过反复试验,我发现在 urls.py 中添加最后两行会导致问题:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', views.api_root),
    path('_ah/warmup/', views.service_status),
    path('_ah/start/', views.service_status),
    ...

但是我不明白为什么会导致 CORS 错误或如何解决它。

【问题讨论】:

我不确定,但可能this 是您要找的。​​span> 感谢您的建议!我应该提到我在脚本处理程序中遇到了这个问题,它似乎只适用于静态文件处理程序。尽管如此,我已经尝试过了,但它是一样的。 【参考方案1】:

我在项目解决方案中也遇到了同样的问题

    将 corsheaders.middleware.CorsMiddleware 放在顶部

    MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    
    ]
    

    ALLOWED_HOSTS = ['*']

    在settings.py底部添加

     CORS_ORIGIN_ALLOW_ALL = True
    

【讨论】:

【参考方案2】:

这个想法可能值得一试。尝试将您的 'corsheaders.middleware.CorsMiddleware' 行移到 MIDDLEWARE 部分的顶部。

这是在pypi django-cors-headers documentation 中推荐的,他们说“CorsMiddleware 应该放在尽可能高的位置,尤其是在任何可以生成响应的中间件之前,例如 Django 的 CommonMiddleware 或 Whitenoise 的 WhiteNoiseMiddleware。如果不是之前,它不会是能够将 CORS 标头添加到这些响应中。”

【讨论】:

当你添加最后两个 url 时,/api/admin 仍然给出 CORS 错误吗?什么是状态码?如果它在 400 或 500 范围内,则可能不是 CORS 问题。 你说的太对了,这不是 CORS 问题。我收到该消息是因为 500 错误触发了 CORS 错误。谢谢你的提示,不知道我是否会弄清楚。【参考方案3】:

这里勾选'Content-Type':"application/json",如果输入Contenttype或者ContentType会报CORS header被阻塞的错误

【讨论】:

以上是关于Django / React Cross-Origin Request Blocked Error 托管 Google App Engine django-cors-headers 不工作的主要内容,如果未能解决你的问题,请参考以下文章

React + Django 的最佳安全实践

React 和 Django 部署

React,Django:用户更改密码后如何管理会话?

Heroku 在通过 Django 部署之前构建 React 应用程序

如何在 React 中访问 Django 会话

Django/React 415(不支持的媒体类型)