Django 1.9 + django-cors-headers + AJAX无效

时间:2016-07-13 15:10:21

标签: ajax django cors

我正在尝试在返回json的Django应用程序和运行AJAX的客户端之间进行跨站点通信。

我正在使用django-cors-headers以下配置:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp.apps.MyAppConfig',
    'corsheaders',
]

MIDDLEWARE_CLASSES = [
    'django.middleware.security.SecurityMiddleware',
    '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',

]


CORS_ORIGIN_ALLOW_ALL = True

现在我试图允许所有连接只是进行测试。 这是我的观点:

def index(request):
    if request.is_ajax:     
        results={}
        results=["The password is valid"]
        data_json=json.dumps(results)

    mimetype="application/json"
    return HttpResponse(data_json,mimetype)

我也尝试过装饰者@csrf_exempt。 最后,这是我的AJAX:

$.ajax({
    url: "http://otherdomain.com/myapp/",
    type: "POST",
    crossDomain: true,
    data :{ 
            'username': $("#myName").val(),
        },
    dataType: "json",
    success:function(result){
        alert(JSON.stringify(result));
    },
    error:function(xhr,status,error){
        alert(status);
    }
});

控制台警告:

  

XMLHttpRequest无法加载http://otherdomain.com/myapp/。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许来源'thisdomain.com'访问。

任何帮助都会有用。非常感谢你。

2 个答案:

答案 0 :(得分:2)

Django-cors-headers是一个过时的回购 - 最后一次提交是一年前。您应该使用Django-cors-middleware,这是该回购的实时分支。

我不认为您的设置存在任何问题,并且期望更新软件包可以解决您的问题。问题很可能是您使用旧版软件包不支持的新版Django。

编辑:

根据评论中的标题,您还需要add an X-CsrfToken header来发送POST请求。我相信这种类型的跨域ajax请求会产生误导性的CORS错误,即使问题实际上是由于缺乏CSRF。

例如,如果您正在处理与应用服务器位于不同端口的单个页面应用程序,则上述响应会起作用。但是,如果这是对第三方服务器的跨源请求,则需要确保它们支持CORS。如果他们不这样做,您需要从服务器而不是客户端的浏览器发出POST请求。

答案 1 :(得分:1)

根据您的评论,我可以认为您忘记在您的网络服务器/托管上启用cors支持。当您使用Dreamhost时,可以参考它的文档here

同样正如@YPCrumble在他的answer中所说,当你有工作请求时,你可能想要使用最新的叉子Django-cors-middleware