Django-cors-headers 不工作

Posted

技术标签:

【中文标题】Django-cors-headers 不工作【英文标题】:Django-cors-headers not working 【发布时间】:2016-06-08 00:29:07 【问题描述】:

我的 django 版本是 1.8.6。我已将 corsheaders 文件夹复制到项目文件夹中。我已经 pip install django-cors-headers(ver 1.1.0)。这是我的设置.py:

    INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'MyWebsite_app',
    'storages',
    'rest_framework',
    'corsheaders',
)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
)

CORS_ORIGIN_ALLOW_ALL = True

这是我的 jquery:

function getLeague() 
$.ajax(
    url: 'http://otherdomain.ashx?username=xxx&password=xxx&sportsBook=xxx&sportsType=xxx&gameType=xxx',
    type: 'GET',
    dataType: 'json',
    success: function(data) 
        alert('Success');
    ,
    error: function(data) 
        alert('Fail');
    
    );

在执行 getLeague() 时,它会一直提示“失败”。当我看到控制台时,它显示“XMLHttpRequest 无法加载http://otherdomain.ashx?username=xxx&password=xxx&sportsBook=xxx&sportsType=xxx&gameType=xxx。请求的源上不存在 Access-Control-Allow-Origin 标头”。我应该在 urls.py 还是 view.py 中添加一些代码?谢谢。

【问题讨论】:

dataType: 'jsonp', 或者您可以发布网址的输出吗? @Jai 我也试过 jsonp。但它也不起作用。这是返回示例: "Msg":"","t":1456383442,"IsFullRefresh":true,"Refresh":["UID":"3e9b72f916de06f619ebeb8493f34817","CID":"1dcdbcab"]我已经检查了 jsonlin.com,它是一个有效的 json。 我不在 django 应用程序上工作,但你这里有一个尾随逗号 `'corsheaders',`。 @Jai 谢谢你的回复。但在 django 中,尾随逗号不会有问题。我认为那不是问题 尝试从MIDDLEWARE_CLASSES注释掉'django.middleware.clickjacking.XFrameOptionsMiddleware', 【参考方案1】:

最好在您的应用程序中创建一个代理,该代理将调用另一个域并返回数据:

function getLeague() 
  $.ajax(
    url: '/crossdomainData',
    type: 'GET',
    dataType: 'json',
    success: function(data) 
        alert('Success');
    ,
    error: function(data) 
        alert('Fail');
    
    );

当你使用 django 时,你可以导入这个Django HTTP Proxy

简介

Django HTTP 代理为 Django Web 开发框架提供了简单的 HTTP 代理功能。 它允许您通过从运行 Django 应用程序的主服务器请求外部服务器来向外部服务器发出请求。此外,它允许您记录对这些请求的响应并播放他们随时回来。


另一个选项在这里taken from this post 由@dvcrn 回答。

import urllib2
    def crossdomainData(request):
        url = "http://otherdomain.ashx?username=xxx&password=xxx&sportsBook=xxx&sportsType=xxx&gameType=xxx"
        req = urllib2.Request(url)
        response = urllib2.urlopen(req)
        return HttpResponse(response.read(), content_type="application/json")

【讨论】:

不错的一个。这不会增加主服务器的开销吗? @Wtower 对不起,我不太了解服务器的工作原理。但是,实际上我没有安装 django-http-proxy。我只是按照 Jai 给出的功能。即使没有安装 django-http-proxy 我也可以工作。【参考方案2】:

大约 500 个错误发生在 CORS 中间件之前,因此它没有机会添加 CORS 标头。如果响应状态码是 500,这可能是问题所在,CORS 可能工作正常。

【讨论】:

以上是关于Django-cors-headers 不工作的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django-cors-headers 让我的 API 正常工作而不会出现 405 错误

django-cors-headers 不适用于 DRF(Django Rest 框架)

将 ID 添加到 URL 时,django-cors-headers 不起作用

我正在使用 angularjs 和 django-cors-headers 然后给出“这对于需要预检的跨域请求是不允许的。”

django-cors-headers CORS_ORIGIN_WHITELIST 元组与字符串问题

django-cors-headers 和 nginx 配置:预检响应缺少 CORS 标头