1. 程式人生 > 其它 >django+redis前後端分離專案 - 1 跨域

django+redis前後端分離專案 - 1 跨域

1. 跨域

跨域:
跨域請求分類(簡單請求,複雜請求):
  簡單請求(同時滿足以下三個條件)
    1. 請求方式必須為get,head,post
    2. 請求頭僅包含:accept,accept-language,content-language,content-type
    3. content-type僅支援以下三種:application/x-www-form-urlencoded,multipart/form-data,text/plain
  複雜請求:
    不是簡單請求的請求

簡單請求的流程:
  簡單請求的請求頭中會自帶origin,表名自己來自於哪個域
  響應會帶有access-control-allow-origin的響應頭,表名後端接收的域
複雜請求(預檢請求)的流程:
  1. 先發一個options請求,攜帶origin,access-control-request-method,access-control-request-headers請求頭
  2. 伺服器處理請求,返回access-control-allow-origin,
access-control-request-method,access-control-request-headers響應頭
  3. 瀏覽器再次傳送真實請求
  備註:預檢請求會發送兩次請求,會增大伺服器的壓力,所以在options預檢請求的時候,伺服器會返回一個access-control-max-age的響應頭,
    返回一個有效時間(一般一天),瀏覽器在有效期期間再次請求時不必再發options請求,直接傳送真實請求即可。

解決方法
1. jsonp
只能傳送get請求,不使用
2. cors
跨域資源共享


2. django的cors解決跨域

1. installed_app中新增corsheaders
2. middleware中新增'corsheaders.middleware.CorsMiddleware' 位置儘量靠前,官方建議放在'django.middleware.common.CommonMiddleware'之前 3. CORS_ORIGIN_ALLOW_ALL值為True時,白名單不啟用,所有域名均可訪問 4. CORS_ORIGIN_WHITELIST 白名單啟用,是個列表或元組 5. CORS_ALLOW_METHODS 允許的請求方式 6. CORS_PREFLIGHT_MAX_AGE 在多少時間內,不用預檢請求,預設86400s,即一天
CORS_ALLOW_METHODS = (
    
'DELETE', 'GET', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'VIEW', ) CORS_ALLOW_HEADERS = ( 'accept', 'accept-encoding', 'authorization', 'content-type', 'dnt', 'origin', 'user-agent', 'x-csrftoken', 'x-requested-with', )
access-control-request-method,access-control-request-headers