Django 跨域資源共享(CORS)全面配置指南
一、CORS核心原理與中間件選型
1. 跨域問題示意圖
2. 推薦中間件庫
pip install django-cors-headers # 當(dāng)前版本4.3.1
二、基礎(chǔ)配置流程
1. 中間件配置(關(guān)鍵順序)
# settings.py
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # 必須盡可能靠前
'django.middleware.common.CommonMiddleware',
# 其他中間件...
]
2. 最小化安全配置
# 允許的域名白名單
CORS_ALLOWED_ORIGINS = [
"https://www.example.com",
"http://localhost:8080",
]
# 啟用帶憑證的請求
CORS_ALLOW_CREDENTIALS = True
CSRF_COOKIE_SAMESITE = 'None' # 配合CORS使用
SESSION_COOKIE_SAMESITE = 'None'三、細(xì)粒度控制策略
1. 域名控制矩陣
| 配置項(xiàng) | 作用域 | 示例值 |
|---|---|---|
| CORS_ALLOWED_ORIGINS | 精確匹配 | ["https://api.example.com"] |
| CORS_ALLOW_ORIGIN_REGEXES | 正則匹配 | [r"^https://\w+\.example\.com$"] |
| CORS_ALLOW_ALL_ORIGINS | 全部允許(危險!) | True (僅限開發(fā)環(huán)境) |
2. 方法/Header控制
# 允許的HTTP方法
CORS_ALLOW_METHODS = [
'GET',
'POST',
'PUT',
'PATCH',
'DELETE',
'OPTIONS'
]
# 允許的自定義Headers
CORS_ALLOW_HEADERS = [
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
]
# 預(yù)檢請求緩存時間(秒)
CORS_PREFLIGHT_MAX_AGE = 86400 # 24小時四、高級場景配置
1. 動態(tài)域名白名單
# 結(jié)合數(shù)據(jù)庫動態(tài)控制
def cors_allow_origins(request):
allowed_domains = Site.objects.filter(is_active=True).values_list('domain', flat=True)
return [f"https://{domain}" for domain in allowed_domains]
CORS_ALLOWED_ORIGINS = cors_allow_origins(None)
2. 多環(huán)境差異化配置
# 開發(fā)環(huán)境配置
if DEBUG:
CORS_ALLOW_ALL_ORIGINS = True
CORS_ALLOW_HEADERS += ['debug-token']
else:
CORS_ALLOWED_ORIGIN_REGEXES = [
r"^https://\w+\.example\.com$",
r"^https://example-\d+-app\.cloudprovider\.com$"
]
3. 自定義響應(yīng)頭處理
# 添加自定義CORS頭
CORS_EXPOSE_HEADERS = ['X-Custom-Header', 'Content-Range']
# 在中間件中動態(tài)添加
class CustomCorsMiddleware(CorsMiddleware):
def process_response(self, request, response):
response = super().process_response(request, response)
response['X-API-Version'] = '2.0'
return response
五、安全加固方案
1. 生產(chǎn)環(huán)境推薦配置
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
"https://www.example.com",
"https://cdn.example.net"
]
CORS_ALLOW_METHODS = ['GET', 'POST', 'OPTIONS']
CORS_ALLOW_HEADERS = [
'authorization',
'content-type',
]
CORS_PREFLIGHT_MAX_AGE = 600 # 10分鐘
2. 防御惡意請求
# 限制OPTIONS請求頻率
from django.core.cache import cache
class ThrottledCorsMiddleware(CorsMiddleware):
def process_view(self, request, *args, **kwargs):
if request.method == 'OPTIONS':
ip = request.META.get('REMOTE_ADDR')
if cache.get(f'cors_options_{ip}'):
return HttpResponseTooManyRequests()
cache.set(f'cors_options_{ip}', True, 60)
return super().process_view(request, *args, **kwargs)
六、調(diào)試與驗(yàn)證
1. 測試CORS配置
# 使用cURL驗(yàn)證 curl -H "Origin: http://test.com" \ -H "Access-Control-Request-Method: POST" \ -H "Access-Control-Request-Headers: X-Requested-With" \ -X OPTIONS --verbose http://api.example.com/data
2. 瀏覽器控制臺檢查
// 前端測試代碼
fetch('https://api.example.com/data', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
credentials: 'include'
}).then(response => {
console.log(response.headers.get('Access-Control-Allow-Origin'))
});
七、常見問題排查
| 現(xiàn)象 | 可能原因 | 解決方案 |
|---|---|---|
| 403 Forbidden | CSRF與CORS配置沖突 | 檢查CSRF_TRUSTED_ORIGINS設(shè)置 |
| 預(yù)檢請求失敗 | 缺少OPTIONS方法支持 | 確認(rèn)CORS_ALLOW_METHODS包含OPTIONS |
| Cookie未攜帶 | 未設(shè)置credentials: 'include' | 前后端同時啟用ALLOW_CREDENTIALS |
| 自定義Header不生效 | 未聲明CORS_EXPOSE_HEADERS | 添加需要暴露的Header到配置列表 |
通過本教程,您將掌握:
- Django項(xiàng)目CORS策略的精細(xì)化配置
- 生產(chǎn)環(huán)境下的安全最佳實(shí)踐
- 復(fù)雜業(yè)務(wù)場景的定制化解決方案
- 跨域問題的系統(tǒng)化調(diào)試方法論
到此這篇關(guān)于Django 跨域資源共享(CORS)全面配置指南的文章就介紹到這了,更多相關(guān)Django 跨域資源共享內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pyinstaller打包xgboost項(xiàng)目發(fā)生錯誤問題及解決
用pyinstaller打包調(diào)用了xgboost的項(xiàng)目時,運(yùn)行打包生成的可執(zhí)行文件時報錯,原因是libxgboost.so的一個依賴庫libgomp-a34b3233.so.1.0.0沒找到,將libgomp.so.1.0.0復(fù)制項(xiàng)目目錄并重命名為libgomp-a34b3233.so.1.0.0即可解決2026-01-01
python統(tǒng)計(jì)一個文本中重復(fù)行數(shù)的方法
這篇文章主要介紹了python統(tǒng)計(jì)一個文本中重復(fù)行數(shù)的方法,涉及針對Python中dict對象的使用及相關(guān)本文的操作,具有一定的借鑒價值,需要的朋友可以參考下2014-11-11
Python中連通域分割Two-Pass算法的原理與實(shí)現(xiàn)詳解
兩遍掃描法(?Two-Pass?),正如其名,指的就是通過掃描兩遍圖像,將圖像中存在的所有連通域找出并標(biāo)記,本文將詳細(xì)介紹Two-Pass算法的原理與實(shí)現(xiàn),需要的可以參考下2023-12-12
Python Requests訪問網(wǎng)絡(luò)更方便
這篇文章主要介紹了使用Python Requests訪問網(wǎng)絡(luò),Python Requests 是一個非常強(qiáng)大的 HTTP 客戶端庫,用于發(fā)送 HTTP 請求,獲取響應(yīng)等操作,通過這個庫,你可以輕松地與 Web 服務(wù)進(jìn)行交互,實(shí)現(xiàn)各種網(wǎng)絡(luò)請求2024-01-01
基于Django filter中用contains和icontains的區(qū)別(詳解)
下面小編就為大家分享一篇基于Django filter中用contains和icontains的區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12
Pytorch 如何訓(xùn)練網(wǎng)絡(luò)時調(diào)整學(xué)習(xí)率
這篇文章主要介紹了Pytorch 如何訓(xùn)練網(wǎng)絡(luò)時調(diào)整學(xué)習(xí)率的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05
python進(jìn)階_淺談面向?qū)ο筮M(jìn)階
下面小編就為大家?guī)硪黄猵ython進(jìn)階_淺談面向?qū)ο筮M(jìn)階。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08

