同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,若是缺乏了同源策略,则浏览器的正常功能可能都会受到影响。能够说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现django
请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同.json
好比:我在本地上的域名是127.0.0.1:8000,请求另一个域名:127.0.0.1:8001一段数据跨域
浏览器上就会报错浏览器
朝一个不一样域的url地址发送请求,浏览器报错安全
CORS须要浏览器和服务器同时支持。目前,全部浏览器都支持该功能,IE浏览器不能低于IE10。服务器
整个CORS通讯过程,都是浏览器自动完成,不须要用户参与。对于开发者来讲,CORS通讯与同源的AJAX通讯没有差异,代码彻底同样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感受。app
所以,实现CORS通讯的关键是服务器。只要服务器实现了CORS接口,就能够跨源通讯。函数
def get(self,request,*args,**kwargs): print('get请求来了') obj=HttpResponse('ok') obj['Access-Control-Allow-Origin']='http://127.0.0.1:8000' #容许哪一个域的url地址 return obj
浏览器就不会报错了post
只发一次请求url
只要同时知足如下两大条件,就属于简单请求。
(1) 请求方法是如下三种方法之一: HEAD GET POST (2)HTTP的头信息不超出如下几种字段: Accept Accept-Language Content-Language Last-Event-ID Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
凡是不一样时知足上面两个条件,就属于非简单请求。
浏览器对这两种请求的处理,是不同的。
两次请求,在发送数据以前会先发一次请求用于作“预检”(OPTIONS请求),只有“预检”经过后才再发送一次请求用于数据传输。
这里发的是json格式因此不符合简单请求的要求,浏览器也报错
非简单请求第一次是发送预检请求OPTIONS
如今须要容许经过,发送post数据
后台views.py
def index(request): obj = HttpResponse('ok') if request.method == 'OPTIONS': # 容许请求 #请求头任意的东西均可以 obj["Access-Control-Allow-Headers"] = "*" obj['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8000' # 容许哪一个域的url地址 return obj
写在视图函数里面不合适,应该写在中间件里,在应用目录下新建一个py文件,若是不知道中间件继承的是谁,能够复制一条中间件改成
from django.middleware.security import SecurityMiddleware
点进SecurityMiddleware里面看一下就知道了
from django.utils.deprecation import MiddlewareMixin class CorsMiddle(MiddlewareMixin): def process_response(self, request, response): if request.method == 'OPTIONS': response["Access-Control-Allow-Headers"] = "*" response['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8000' # 容许哪一个域的url地址 return response
记得在settings里面注册中间件
MIDDLEWARE = [ 'app01.middle.CorsMiddle', ]
之后就能够把本身写的中间件放到别的项目里面用