这篇文章主要给你们介绍了关于Django跨域请求问题解决的相关资料,文中介绍的实现方法包括:使用django-cors-headers全局控制、使用JsonP,只能用于Get方法以及在views.py里设置响应头,只能控制单个接口,须要的朋友能够参考下。
使用Django在服务器端写了一个API,返回一个JSON数据。使用Ajax调用该API:python
可是,Chrome浏览器提示错误:nginx
No 'Access-Control-Allow-Origin' header is present on the requested resource.
这是因为CORS致使的。git
什么是CORS?github
CORS(跨域资源共享,Cross-Origin Resource Sharing)是一种跨域访问的机制,可让Ajax实现跨域访问。
其实,在服务器的response header中,加入“Access-Control-Allow-Origin: *”便可支持CORS,很是的简单,apache/nginx等怎么配置,见参考文档。
举个例子:ajax
几种方法:apache
1.使用JSONP使用Ajax获取json数据时,存在跨域的限制。不过,在Web页面上调用js的script脚本文件时却不受跨域的影响,JSONP就是利用这个来实现跨域的传输。所以,咱们须要将Ajax调用中的dataType从JSON改成JSONP(相应的API也须要支持JSONP)格式。
JSONP只能用于GET请求。django
2.直接修改Django中的views.py文件修改views.py中对应API的实现函数,容许其余域经过Ajax请求数据:json
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 response
3.安装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', )