django - 總結 - 跨域請求

script  ->jsonp跨域

瀏覽器的同源策略:不能跨越網站請求信息;html

  XMLHttpRequests遵循這個規定。ajax

  所以ajax等基於XML的都不能進行跨站請求django

而咱們知道img,iframe,script等擁有src屬性的能夠進行跨站請求,json

而利用這些標籤進行的跨站方式成爲jsonp跨域

以script爲例:瀏覽器

function submitJsonp2() {
    var tag = document.createElement('script');
    tag.src = 'http://127.0.0.1:9000/xiaokai.html';
    document.head.appendChild(tag);
    document.head.removeChild(tag);
}
 
function fuck(arg) {
    //進行操做
    $('#content').html(arg);
}//而請求發回的會是保存在js文件內,// 所以咱們以相似函數調用的方式把信息看成參數傳遞給本地接收參數的函數,進行操做// 此處的func名由服務端生命
(普通)
function submitJsonp4() {
    $.ajax({
        url: 'http://127.0.0.1:9000/xiaokai.html',
        type: 'POST',
        dataType: 'jsonp',
        jsonp: 'callback',
        jsonpCallback: 'func'
    })
}
function func(arg) {
    console.log(arg);
}基於ajax操做當聲明dataType:jsonp會以另一種,不一樣於XML的方式發送,//並且返回的函數名有本身規定

 

import json
def service(request):
    info = {'name':'alex','age':34,'price':200}
    func = request.GET.get('callbacks')     # jQuery21405849947152306905_1529041780670
    return HttpResponse("%s('%s')"%(func,json.dumps(info)))

 

牛逼方式

告訴瀏覽器 不用攔截了。
#
response['Access-Control-Allow-Origin'] = "http://127.0.0.1:8003" response['Access-Control-Allow-Origin'] = "*"    # 高速瀏覽器 那些域名不攔截

 

CORS

1、簡介

CORS須要瀏覽器和服務器同時支持。目前,全部瀏覽器都支持該功能,IE瀏覽器不能低於IE10。服務器

整個CORS通訊過程,都是瀏覽器自動完成,不須要用戶參與。對於開發者來講,CORS通訊與同源的AJAX通訊沒有差異,代碼徹底同樣。瀏覽器一旦發現AJAX請求跨源,就會自動添加一些附加的頭信息,有時還會多出一次附加的請求,但用戶不會有感受。app

所以,實現CORS通訊的關鍵是服務器。只要服務器實現了CORS接口,就能夠跨源通訊。ide

2、兩種請求

瀏覽器將CORS請求分紅兩類:簡單請求(simple request)和非簡單請求(not-so-simple request)。函數

只要同時知足如下兩大條件,就屬於簡單請求。

(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
- 「預檢」其實作檢查,檢查若是經過則容許傳輸數據,檢查不經過則再也不發送真正想要發送的消息
- 如何「預檢」
     => 若是複雜請求是PUT等請求,則服務端須要設置容許某請求,不然「預檢」不經過
        Access-Control-Request-Method
     => 若是複雜請求設置了請求頭,則服務端須要設置容許某請求頭,不然「預檢」不經過
        Access-Control-Request-Headers

 

支持跨域,簡單請求

服務器設置響應頭:Access-Control-Allow-Origin = '域名' 或 '*'

支持跨域,複雜請求

因爲複雜請求時,首先會發送「預檢」請求,若是「預檢」成功,則發送真實數據。

  • 「預檢」請求時,容許請求方式則需服務器設置響應頭:Access-Control-Request-Method
  • 「預檢」請求時,容許請求頭則需服務器設置響應頭:Access-Control-Request-Headers

 

 

 

中間件配置

from django.utils.deprecation import MiddlewareMixin

class CORSMiddleware(MiddlewareMixin):
    def process_response(self,request,response):
        # 容許你的域名來訪問
        response['Access-Control-Allow-Origin'] = "*"

        if request.method == 'OPTIONS':
            # 容許你攜帶 Content-Type 請求頭 不能寫*
            response['Access-Control-Allow-Headers'] = 'Content-Type'
            # 容許你發送 DELETE PUT請求
            response['Access-Control-Allow-Methods'] = 'DELETE,PUT'

        return response
相關文章
相關標籤/搜索