stdjkdblom 2019-06-28
使用Django在服务器端写了一个API,返回一个JSON数据。使用Ajax调用该API:
但是,Chrome浏览器提示错误:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
这是由于CORS导致的。
什么是CORS?
CORS(跨域资源共享,Cross-Origin Resource Sharing)是一种跨域访问的机制,可以让Ajax实现跨域访问。
其实,在服务器的response header中,加入“Access-Control-Allow-Origin: *”即可支持CORS,非常的简单,apache/nginx等怎么配置,见参考文档。
举个例子:
几种方法:
1.使用JSONP使用Ajax获取json数据时,存在跨域的限制。不过,在Web页面上调用js的script脚本文件时却不受跨域的影响,JSONP就是利用这个来实现跨域的传输。因此,我们需要将Ajax调用中的dataType从JSON改为JSONP(相应的API也需要支持JSONP)格式。
JSONP只能用于GET请求。
2.直接修改Django中的views.py文件修改views.py中对应API的实现函数,允许其他域通过Ajax请求数据:
def myview(_request):  
    response = HttpResponse(json.dumps({"key": "value", "key2": "value"}))
    response["Access-Control-Allow-Origin"] = "*"  
    response["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS"  
    response["Access-Control-Max-Age"] = "1000"  
    response["Access-Control-Allow-Headers"] = "*"  
    return response3.安装django-cors-headers这里还有一各发现!在Django中,有人开发了CORS-header的middleware,只在settings.py中做一些简单的配置即可,见:https://github.com/ottoyiu/dj...,开启CORS,没有跨域烦恼,真爽!~
django-cors-headers
首先安装
然后在settings.py里配置一番就可以
INSTALLED_APPS = [  
     ...  
     'corsheaders', 
     ...  ]    
 MIDDLEWARE_CLASSES = ( 
     ...  
     #尽可能靠前,必须在CsrfViewMiddleware、CommonMiddleware之前。
     #我们直接放在第一个位置就好了
     'django.middleware.csrf.CsrfViewMiddleware',
     'corsheaders.middleware.CorsMiddleware',  
     'django.middleware.common.CommonMiddleware', 
     ... 
 ) 
添加参数为true
CORS_ORIGIN_ALLOW_ALL = True
#下面这些可以不用设置
#跨域增加忽略 
CORS_ALLOW_CREDENTIALS = True
#设置白名单
CORS_ORIGIN_WHITELIST = (  '*')   
CORS_ALLOW_METHODS = (  'DELETE',  'GET',  'OPTIONS',  'PATCH',  'POST',  'PUT',  'VIEW', )   
CORS_ALLOW_HEADERS = (  
'XMLHttpRequest',  
'X_FILENAME',  
'accept-encoding', 
'authorization',  
'content-type',  
'dnt',
'origin',  
'user-agent',  
'x-csrftoken',  
'x-requested-with',  
'Pragma', 
) 结束数据方法的参数,该如何定义?-- 集合为自定义实体类中的结合属性,有几个实体类,改变下标就行了。<input id="add" type="button" value="新增visitor&quo
本文实例讲述了php+ ajax 实现的写入数据库操作。分享给大家供大家参考,具体如下:。<input class="tel" type="text" placeholder="请输入您的手机号码&q