DRF跨域,簡單請求和複雜請求
阿新 • • 發佈:2018-12-21
跨域就是跨域名,跨埠
- 為什麼會有跨域?
瀏覽器有同源限制策略
- 繞過瀏覽器同源策略就可以跨域
- jsonp(利用瀏覽器特性)
動態建立script標籤
同源策略會阻止ajax請求,但不阻止具有src屬性的標籤
<script src='xxx'></script>
<img src='xxx' />
- cors(硬剛)
設定響應頭
class MiddlewareMixin: def __init__(self, get_response=None): self.get_responsecors= get_response super().__init__() def __call__(self, request): response = None if hasattr(self, 'process_request'): response = self.process_request(request) response = response or self.get_response(request) if hasattr(self, 'process_response'): response= self.process_response(request, response) return response class CORSMiddleware(MiddlewareMixin): def process_response(self,request,response): # 允許你的域名來獲取的我資料 response["Access-Control-Allow-Origin"] = "*" return response
簡單請求 複雜請求
1、請求方式:HEAD、GET、POST 2、請求頭資訊: 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 text/plain關於預檢
class CORSMiddleware(MiddlewareMixin): def process_response(self,request,response): # 允許你的域名來獲取的我資料 # response["Access-Control-Allow-Origin"] = "*" # 允許你攜帶Content-Type請求頭 # response["Access-Control-Allow-Headers"] = "Content-Type" # 允許你傳送DELETE,PUT # response["access_Control-Allow-Methods"] = "DELETE,PUT" if request.method == 'OPTIONS': response["Access-Control-Allow-Headers"] = "Content-Type" return response例項