Python 25 Django跨域请求
成因:浏览器的同源策略会阻止域名或端口不同的源地址发送的请求,前后端都能收到请求,但是浏览器会报错,这是为了防止出现安全问题,就像xss攻击一样,对方可能发送的是一个方法名加(),如果直接接受的话就会执行这个方法,造成一些不可控的后果。
跨域请求还分为两种:简单请求和复杂请求
简单请求:
Http方法是GET/POST/HEAD之一 HTTP头信息不超出以下几种字段 Accept, Accept-Language, Content-Language, Last-Event-ID Content-Type只能是下列类型中的一个 application/x-www-from-urlencoded multipart/form-data text/plain
不满足任何一个条件就是复杂请求。复杂请求会先发送一个OPTIONS请求进行预检
一、jsonp方式
浏览器的同源策略会阻止ajaxa请求,但不阻止src。
jsonp方式其实是利用了<script>标签可以直接跨域的性质,在body中生成一个<script>标签,然后通过个这标签发送请求并拿到数据。
但是这样的方式不能发送post请求,也不能自定义请求头。
<script> $.ajax({ url:"xxxxxxx", type:"GET", dataType:"jsonp", jsonp:"callbacks" #给跨域的返回数据的键 //jsonpCallbacks:"xxx" #给定的返回函数的函数名 success:function(arg){ console.log(arg) } }) </script>
二、cors方式
跨域的两种原因:域名不同或端口不同,或是默认发送请求时只发送了一个响应体,cores解决跨域的本质是添加一个响应头。
1、单个请求
response = HttpResponse("111") response["Access-Control-Allow-Origin"] = "xxxx" #发送请求的urlIP和端口
2、全局
class CORESMiddleware(MiddlewareMixin): def process_response(self,request,response): #添加响应头 response["Access-Control-Allow-Origin"] = "http://xxxxx,http://xxxxx" #表示允许这些域名跨域访问,如果对所有域名开放,则使用*号 #如果是复杂请求 response["Access-Control-Allow-Header"] = "Content-Type,xxx" #不能使用*号 #允许某些方法 response["Access-Control-Allow-Method"] = "DELETE,PUT" return response