跨域問題
根本原因:瀏覽器的同源策略,瀏覽器拒絕不是當前域返回的數據
ps:ip地址和端口號都相同才是同一個域
CORS基本流程
瀏覽器將CORS請求分成兩類:簡單請求和非簡單請求
瀏覽器發出CORS簡單請求,只需要在頭信息之中增加一個Origin字段
瀏覽器發出CORS非簡單請求,會在正式通信之前,增加一次HTTP查詢請求,稱為“預檢”請求(OPTIONS請求)。瀏覽器先詢問服務器,當前網頁所在的域名是否在服務器的許可名單之中,以及可以使用哪些HTTP動詞和頭信息字段。只有得到肯定答復,瀏覽器才會發出正式的XMLHttpRequest請求,否則就報錯。
解決跨域問題(寫好這個中間件配置一下)
class MyCorsMiddle(MiddlewareMixin):
def process_response(self, request, response):
if request.method == 'OPTIONS':
# 允許它
response['Access-Control-Allow-Headers'] = 'Content-Type'
# obj['Access-Control-Allow-Headers']='*'
# obj['Access-Control-Allow-Origin']='http://127.0.0.1:8000'
response['Access-Control-Allow-Origin'] = '*'
return response
補充:
支持跨域,簡單請求
服務器設置響應頭:Access-Control-Allow-Origin = ‘域名’ 或 ‘*’
支持跨域,復雜請求
由於復雜請求時,首先會發送“預檢”請求,如果“預檢”成功,則發送真實數據。
- “預檢”請求時,允許請求方式則需服務器設置響應頭:Access-Control-Request-Method(put請求等)
- “預檢”請求時,允許請求頭則需服務器設置響應頭:Access-Control-Request-Headers
Djangocorsheaders(第三方cors)
DRF后端實現跨域我們使用一個第三方擴展——— djangocorsheaders
安裝
pip install django-cors-headers
注冊
INSTALLED_APPS = (
'corsheaders',
)
添加中間件
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', #最好添加至第一行
]
配置白名單
#單個配置
CORS_ORIGIN_WHITELIST =(
' 域名',
)
#正則配置:
CORS_ORIGIN_REGEX_WHITELIST =(r'^(https?://)?(\w+\.)?jim\.com $',)
或者直接允許所有主機跨域
CORS_ORIGIN_ALLOW_ALL = True 默認為False
