由于安全問題,瀏覽器會(huì)有一個(gè)同源策略,對(duì)于不同源的站點(diǎn)之間的請(qǐng)求會(huì)做限制(跨域限制是瀏覽器的原因,而不是服務(wù)器的原因)
同源策略
同源指域名(IP),協(xié)議,端口都相同,不同源的客戶端腳本(javascript)在沒有授權(quán)的情況下,不能讀寫對(duì)方的資源。
跨域的判定流程
- 瀏覽器先根據(jù)同源策略對(duì)前端頁面和后臺(tái)交互地址做匹配,若同源,則直接發(fā)送數(shù)據(jù)請(qǐng)求;若不同源,則發(fā)送跨域請(qǐng)求。
- 服務(wù)器解析程序收到瀏覽器跨域請(qǐng)求后,根據(jù)自身配置返回對(duì)應(yīng)文件頭。若未配置過任何允許跨域,則文件頭里不包含Access-Control-Allow-origin字段,若配置過域名,則返回Access-Control-Allow-origin+ 對(duì)應(yīng)配置規(guī)則里的域名的方式。
- 瀏覽器根據(jù)接受到的http文件頭里的Access-Control-Allow-origin字段做匹配,若無該字段,說明不允許跨域;若有該字段,則對(duì)字段內(nèi)容和當(dāng)前域名做比對(duì),如果同源,則說明可以跨域,瀏覽器發(fā)送該請(qǐng)求;若不同源,則說明該域名不可跨域,不發(fā)送請(qǐng)求
django解決跨域請(qǐng)求的問題
- 安裝django-cors-headers
pip install django-cors-headers
- 配置settings.py文件
INSTALLED_APPS = [
...
'corsheaders',
...
]
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware', # 注意順序
...
)
#跨域增加忽略
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = (
'*'
)
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'Pragma',
)