1. 程式人生 > >DRF跨域,簡單請求和複雜請求

DRF跨域,簡單請求和複雜請求

跨域就是跨域名,跨埠

- 為什麼會有跨域?

  瀏覽器有同源限制策略

- 繞過瀏覽器同源策略就可以跨域

  - jsonp(利用瀏覽器特性)

     動態建立script標籤

     同源策略會阻止ajax請求,但不阻止具有src屬性的標籤

     <script src='xxx'></script>

     <img src='xxx' />

  - cors(硬剛) 

     設定響應頭

      

class MiddlewareMixin:
    def __init__(self, get_response=None):
        self.get_response 
= 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
cors

 

簡單請求  複雜請求

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
例項