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

 

posted @ 2019-05-29 10:25  不可思议的猪  阅读(373)  评论(0编辑  收藏  举报