在 Django 中启用 CORS(跨源请求)

Posted

技术标签:

【中文标题】在 Django 中启用 CORS(跨源请求)【英文标题】:Enabling CORS (Cross Origin Request) in Django 【发布时间】:2016-11-23 17:41:49 【问题描述】:

我正在尝试在 Django 上运行的项目中使用带有 javascript XMLHttpRequest 的 overpass API http://wiki.openstreetmap.org/wiki/Overpass_API,但我不断收到

 Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://www.google.com/accounts/ClientLogin. (Reason: CORS header 'Access-Control-Allow-Origin' missing). 

错误。无论我使用 GET 还是 POST,以及来自任何其他主机,而不仅仅是 overpass API,我都会收到此错误。

我已经安装了 django-cors-headers https://github.com/ottoyiu/django-cors-headers 并按照那里的说明,将“corsheaders”放入 INSTALLED_APPS,将“corsheaders.middleware.CorsMiddleware”、“django.middleware.common.CommonMiddleware”放入 MIDDLEWARE_APPS 和我已经设置了

CORS_ORIGIN_ALLOW_ALL = true 

在 settings.py 但似乎没有任何效果。我用

在本地运行它
python manage.py runserver

但我也在 openshift 上托管它。这些工作都没有,他们都给出了上面的错误。

如果我在这里遗漏了什么,请告诉我。

【问题讨论】:

您是否在尝试访问 openstreetmap/overpass 的 javascript 中遇到此错误? 是的,我正在尝试在 javascript 中使用 XmlHttpRequest。 这很明显,没有回答问题。我在问您尝试启用 CORS 的站点是否是从不同来源接收请求或向不同来源发出请求的站点......即出现 CORS 错误的 URL 是什么 ***.com/q/35760943/10140011的可能重复 这能回答你的问题吗? How can I enable CORS on Django REST Framework 【参考方案1】:

我在尝试从笔记本电脑 (localhost) 访问托管在 Heroku 的 Django Rest Framework API 时遇到了同样的问题。我正在使用Django 1.10.2DRF 3.4.7python v3.4

我做了pip install django-cors-headers(版本1.2.2)并将其配置为docs,然后再次出现同样的错误:(

继续搜索几个小时然后它击中了我!

我做了pip install django-cors-middleware(1.3.1 版)没有卸载django-cors-headers 包。此外,我的settings.py 文件中没有任何内容(它被配置为django-cors-headers 设置,尽管这两个包没有太大区别——后者是第一个的分支)。

点击刷新(从本地主机),一切都很好!

我现在可以通过jQuery's ajax 方法从myapp.herokuapp.com 获取数据。

【讨论】:

为什么会这样? django-cors-headerdjango-cors-middleware 不相互依赖,那么为什么两者都需要呢?它确实对我有用......但我很困惑为什么。 实际上,django-cors-middlewaredjango-cors-headers 的一个分支(他们在他们的文档中提到了它)。所以,这就是它的工作原理!【参考方案2】:

记得将“corsheaders.middleware.CorsMiddleware”放在列表顶部,而且“django.middleware.common.CommonMiddleware”已经是标准中间件

MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
 ]

【讨论】:

【参考方案3】:

CORS_ORIGIN_ALLOW_ALL = true

应该是:

CORS_ORIGIN_ALLOW_ALL = 真

T 大写字母表示 True。 添加额外的所需中间件

MIDDLEWARE = ['corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware', ]

并将“corsheaders”注册到 INSTALLED_APPS。

【讨论】:

在哪里添加 CORS_ORGIN_ALLOW_ALL = TRUE。 您的设置文件中的@SULPHURICACID

以上是关于在 Django 中启用 CORS(跨源请求)的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Django 网站中发布跨源请求

即使在配置 ASP.NET Core Web API 中启用了 CORS,CORS 也会阻止发布请求

如何使用 Angular 2 在 POST 上启用 ASP.NET MVC 4 中的跨源请求

在 Golang 中启用 CORS

CORS(跨源资源共享)https 不工作(IIS 托管 WCF 休息启用端点)

使用 CORS 过滤器的跨源请求