Django 跨域资源共享(CORS)全面配置指南

 更新时间:2026年07月08日 09:08:07   作者: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 ForbiddenCSRF与CORS配置冲突检查CSRF_TRUSTED_ORIGINS设置
预检请求失败缺少OPTIONS方法支持确认CORS_ALLOW_METHODS包含OPTIONS
Cookie未携带未设置credentials: 'include'前后端同时启用ALLOW_CREDENTIALS
自定义Header不生效未声明CORS_EXPOSE_HEADERS添加需要暴露的Header到配置列表

通过本教程,您将掌握:

  1. Django项目CORS策略的精细化配置
  2. 生产环境下的安全最佳实践
  3. 复杂业务场景的定制化解决方案
  4. 跨域问题的系统化调试方法论

到此这篇关于Django 跨域资源共享(CORS)全面配置指南的文章就介绍到这了,更多相关Django 跨域资源共享内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • pyinstaller打包xgboost项目发生错误问题及解决

    pyinstaller打包xgboost项目发生错误问题及解决

    用pyinstaller打包调用了xgboost的项目时,运行打包生成的可执行文件时报错,原因是libxgboost.so的一个依赖库libgomp-a34b3233.so.1.0.0没找到,将libgomp.so.1.0.0复制项目目录并重命名为libgomp-a34b3233.so.1.0.0即可解决
    2026-01-01
  • python统计一个文本中重复行数的方法

    python统计一个文本中重复行数的方法

    这篇文章主要介绍了python统计一个文本中重复行数的方法,涉及针对Python中dict对象的使用及相关本文的操作,具有一定的借鉴价值,需要的朋友可以参考下
    2014-11-11
  • Python中连通域分割Two-Pass算法的原理与实现详解

    Python中连通域分割Two-Pass算法的原理与实现详解

    两遍扫描法( Two-Pass ),正如其名,指的就是通过扫描两遍图像,将图像中存在的所有连通域找出并标记,本文将详细介绍Two-Pass算法的原理与实现,需要的可以参考下
    2023-12-12
  • Python Requests访问网络更方便

    Python Requests访问网络更方便

    这篇文章主要介绍了使用Python Requests访问网络,Python Requests 是一个非常强大的 HTTP 客户端库,用于发送 HTTP 请求,获取响应等操作,通过这个库,你可以轻松地与 Web 服务进行交互,实现各种网络请求
    2024-01-01
  • Django REST framework 异常处理

    Django REST framework 异常处理

    本文将结合实例代码,介绍Django REST framework 异常处理,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • Python递归时间复杂度

    Python递归时间复杂度

    这篇文章主要介绍了Python递归时间复杂度,时间复杂度一般认为O(logn),但递归算法的时间复杂度本质上是要看递归的次数,每次递归中的操作次数,下面文章详细介绍,需要的朋友可以参考一下
    2022-03-03
  • 使用Python操作Redis的完整指南

    使用Python操作Redis的完整指南

    Redis作为业界主流的内存数据库,配合Python的redis-py库,能在不改变业务代码结构的前提下,把数据库的查询压力降低90%以上,今天我们就从零开始,聊聊怎么用Python操作Redis,搭一套真正能打的缓存系统,需要的朋友可以参考下
    2026-03-03
  • 基于Django filter中用contains和icontains的区别(详解)

    基于Django filter中用contains和icontains的区别(详解)

    下面小编就为大家分享一篇基于Django filter中用contains和icontains的区别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Pytorch 如何训练网络时调整学习率

    Pytorch 如何训练网络时调整学习率

    这篇文章主要介绍了Pytorch 如何训练网络时调整学习率的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • python进阶_浅谈面向对象进阶

    python进阶_浅谈面向对象进阶

    下面小编就为大家带来一篇python进阶_浅谈面向对象进阶。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08

最新评论