在 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.2
、DRF 3.4.7
和python 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-header
和 django-cors-middleware
不相互依赖,那么为什么两者都需要呢?它确实对我有用......但我很困惑为什么。
实际上,django-cors-middleware
是django-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(跨源请求)的主要内容,如果未能解决你的问题,请参考以下文章
即使在配置 ASP.NET Core Web API 中启用了 CORS,CORS 也会阻止发布请求
如何使用 Angular 2 在 POST 上启用 ASP.NET MVC 4 中的跨源请求