我正在尝试在返回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'访问。
任何帮助都会有用。非常感谢你。
答案 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。