Django 跨域资源共享(CORS)全面配置指南
作者:Python游侠
本文主要介绍了Django项目跨域资源共享(CORS)的全面配置方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
一、CORS核心原理与中间件选型
1. 跨域问题示意图
2. 推荐中间件库
pip install django-cors-headers # 当前版本4.3.1
二、基础配置流程
1. 中间件配置(关键顺序)
# 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'三、细粒度控制策略
1. 域名控制矩阵
| 配置项 | 作用域 | 示例值 |
|---|---|---|
| CORS_ALLOWED_ORIGINS | 精确匹配 | ["https://api.example.com"] |
| CORS_ALLOW_ORIGIN_REGEXES | 正则匹配 | [r"^https://\w+\.example\.com$"] |
| CORS_ALLOW_ALL_ORIGINS | 全部允许(危险!) | True (仅限开发环境) |
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',
]
# 预检请求缓存时间(秒)
CORS_PREFLIGHT_MAX_AGE = 86400 # 24小时四、高级场景配置
1. 动态域名白名单
# 结合数据库动态控制
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. 多环境差异化配置
# 开发环境配置
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. 自定义响应头处理
# 添加自定义CORS头
CORS_EXPOSE_HEADERS = ['X-Custom-Header', 'Content-Range']
# 在中间件中动态添加
class CustomCorsMiddleware(CorsMiddleware):
def process_response(self, request, response):
response = super().process_response(request, response)
response['X-API-Version'] = '2.0'
return response
五、安全加固方案
1. 生产环境推荐配置
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)
六、调试与验证
1. 测试CORS配置
# 使用cURL验证 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'))
});
七、常见问题排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 403 Forbidden | CSRF与CORS配置冲突 | 检查CSRF_TRUSTED_ORIGINS设置 |
| 预检请求失败 | 缺少OPTIONS方法支持 | 确认CORS_ALLOW_METHODS包含OPTIONS |
| Cookie未携带 | 未设置credentials: 'include' | 前后端同时启用ALLOW_CREDENTIALS |
| 自定义Header不生效 | 未声明CORS_EXPOSE_HEADERS | 添加需要暴露的Header到配置列表 |
通过本教程,您将掌握:
- Django项目CORS策略的精细化配置
- 生产环境下的安全最佳实践
- 复杂业务场景的定制化解决方案
- 跨域问题的系统化调试方法论
到此这篇关于Django 跨域资源共享(CORS)全面配置指南的文章就介绍到这了,更多相关Django 跨域资源共享内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
