当前位置: 首页 > news >正文

django跨域配置

为了解决 Django 项目的跨域请求(CORS)问题,尤其是在企业级环境中,推荐使用 django-cors-headers 中间件,并结合环境隔离、安全白名单、速率限制等策略进行配置。以下是完整的企业级解决方案:

第一步:安装中间件

pip install django-cors-headers

第二步:配置 Django 项目

settings.py 中添加:

1. 添加到 INSTALLED_APPS

INSTALLED_APPS = [...'corsheaders',...
]

2. 添加到 MIDDLEWARE(务必靠前)

MIDDLEWARE = ['corsheaders.middleware.CorsMiddleware',  # 必须放在最前面之一'django.middleware.common.CommonMiddleware',...
]

第三步:企业级 CORS 策略配置

1. 生产环境使用白名单域名

CORS_ALLOWED_ORIGINS = ["https://app.example.com","https://admin.example.com",
]

或者使用正则表达式:

CORS_ALLOWED_ORIGIN_REGEXES = [r"^https://\w+\.example\.com$",
]

当你在 Django 中配置了 CORS_ALLOWED_ORIGINS 白名单后,只有这些域名才能成功发起跨域请求(如 fetchaxios 请求)。如果请求的来源域名不在白名单中,浏览器会拦截请求,显示 CORS 错误,比如你之前看到的:

No 'Access-Control-Allow-Origin' header is present...

举个例子:

CORS_ALLOWED_ORIGINS = ["https://app.example.com","https://admin.example.com",
]
  • ✅ 来自 https://app.example.com 的请求:允许跨域访问

  • ❌ 来自 http://localhost:8080https://evil.com 的请求:被浏览器拦截,无法访问

🚫 注意:不是后端拒绝,而是浏览器拦截

后端其实是可以收到请求的,但如果没有返回正确的 CORS 响应头,浏览器会阻止前端访问响应内容。这是浏览器的安全机制。

✅ 企业级建议

  • 开发环境可以使用 CORS_ALLOW_ALL_ORIGINS = True 放宽限制

  • 生产环境必须使用白名单,防止恶意网站滥用你的 API

  • 如果你有多个前端子域名,建议使用正则匹配:

CORS_ALLOWED_ORIGIN_REGEXES = [r"^https://.*\.example\.com$",
]

2. 控制允许的方法和头部

CORS_ALLOW_METHODS = ["GET","POST","OPTIONS",
]CORS_ALLOW_HEADERS = ["authorization","content-type","x-requested-with",
]

在 Django 项目中使用 django-cors-headers 中间件时,你可以通过 CORS_ALLOW_METHODSCORS_ALLOW_HEADERS 来精细控制哪些 HTTP 方法和请求头可以被跨域访问。这是企业级安全配置的关键部分。

CORS_ALLOW_METHODS:允许的 HTTP 方法

默认值如下:

CORS_ALLOW_METHODS = ["DELETE","GET","OPTIONS",  # 必须支持,用于预检请求"PATCH","POST","PUT",
]

方法解析:

方法说明
GET获取资源,最常用的读取操作
POST创建资源或提交数据(如登录、表单)
PUT更新整个资源(幂等)
PATCH局部更新资源(非幂等)
DELETE删除资源
OPTIONS浏览器预检请求,必须支持以通过 CORS 验证

✅ 建议:不要随意移除 OPTIONS,否则浏览器将无法完成跨域预检。

CORS_ALLOW_HEADERS:允许的请求头

允许前端在跨域请求中携带这些自定义请求头

默认值如下:

CORS_ALLOW_HEADERS = ["accept","accept-encoding","authorization","content-type","dnt","origin","user-agent","x-csrftoken","x-requested-with",
]

请求头解析:

请求头说明
accept客户端可接受的响应类型(如 JSON)
accept-encoding支持的压缩算法(如 gzip)
authorization认证令牌(如 JWT、Bearer)
content-type请求体的格式(如 application/json
dnt“Do Not Track” 隐私请求标志
origin请求来源域名(由浏览器自动添加)
user-agent客户端信息(浏览器类型等)
x-csrftokenDjango CSRF 令牌(用于保护 POST 请求)
x-requested-withAJAX 请求标志(通常为 XMLHttpRequest

✅ 建议:如果你使用自定义头部(如 X-Auth-Token),需要手动添加到此列表中。

企业级扩展建议

  • 限制敏感方法:如不需要 DELETEPATCH,可移除以减少攻击面。

  • 自定义头部白名单:如使用 debug-tokenx-api-key 等自定义头部,务必添加:

    CORS_ALLOW_HEADERS += ["x-api-key", "debug-token"]
    
  • 暴露响应头(可选):

    CORS_EXPOSE_HEADERS = ["Content-Disposition", "X-RateLimit-Limit"]
    

    这允许前端访问这些响应头信息。

3. 是否允许携带凭证(如 Cookie)

CORS_ALLOW_CREDENTIALS = True

如果你不设置这个为 True,即使前端设置了 withCredentials: true,浏览器也会拒绝发送 Cookie。

第四步:防御恶意请求(可选)

你可以自定义中间件限制 OPTIONS 请求频率,防止滥用:

from corsheaders.middleware import CorsMiddleware
from django.http import HttpResponseTooManyRequests
from django.core.cache import cacheclass 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)

然后替换原来的 CorsMiddleware

第五步:区分环境配置(推荐)

使用环境变量或配置文件区分开发与生产环境:

import osif os.getenv("DJANGO_ENV") == "production":CORS_ALLOWED_ORIGINS = ["https://app.example.com"]
else:CORS_ALLOW_ALL_ORIGINS = True  # 开发环境放宽限制

第六步:确保后端响应 OPTIONS 请求

Django 默认不会处理 OPTIONS 请求。你可以使用 @csrf_exempt 或确保视图支持 OPTIONS 方法,或者使用 DRF 的 APIView,它会自动处理预检请求。


文章转载自:

http://2sMPWDup.zzfjh.cn
http://51u2z3TL.zzfjh.cn
http://qol4vXZT.zzfjh.cn
http://uqZIJAp8.zzfjh.cn
http://DZYpCiQh.zzfjh.cn
http://5Gkjp4fp.zzfjh.cn
http://TdSqU3LM.zzfjh.cn
http://6E7mzzeI.zzfjh.cn
http://0SxwqYYB.zzfjh.cn
http://4Eygj8Pd.zzfjh.cn
http://4w2Vu6ui.zzfjh.cn
http://qPf8saV1.zzfjh.cn
http://NQ3a4rq7.zzfjh.cn
http://Op47QLKe.zzfjh.cn
http://GhOZxdM9.zzfjh.cn
http://hgS6202C.zzfjh.cn
http://T9huiYeu.zzfjh.cn
http://aB2l598P.zzfjh.cn
http://rgIjJzrJ.zzfjh.cn
http://eOeYYNMT.zzfjh.cn
http://VFBCiVkk.zzfjh.cn
http://r33PxK4d.zzfjh.cn
http://RUlXHc0I.zzfjh.cn
http://ekpMMAWK.zzfjh.cn
http://poGKZZYP.zzfjh.cn
http://AjYJo0sQ.zzfjh.cn
http://DF99snkE.zzfjh.cn
http://sNtNUqUz.zzfjh.cn
http://Ypz9PzwW.zzfjh.cn
http://VQ0gXIlX.zzfjh.cn
http://www.dtcms.com/a/373238.html

相关文章:

  • 工控机创新驱动为工业升级注入科技强心剂
  • AI Agents with n8n: 10+ 自动化创意路线图
  • 【计算机视觉】图像中的高频信息,和低频信息指的是什么?
  • 光伏助力碳中和:智慧运营平台如何精准计算与追踪减排贡献?
  • 计算机视觉 (CV) 基础:图像处理、特征提取与识别
  • 网络身份安全防线:身份证实名认证接口-网络社交身份安全
  • 某互联网大厂的面试go语言从基础到实战的经验和总结
  • 软件设计师备考-(十六)数据结构及算法应用(重要)
  • flutter日期选择国际化支持
  • 最短路算法和最小生成树算法详解
  • 2005–2021年中国城市级终端能源消费(含可再生能源)综合数据集
  • Redis入门(部署、持久化、缓存问题)
  • 聊一聊 .NET 中的 CompositeChangeToken
  • 视觉语言模型应用开发——Qwen 2.5 VL模型视频理解与定位能力深度解析及实践指南
  • 深入理解 MDC(Mapped Diagnostic Context):日志记录的利器
  • 工业相机如何通过光度立体成像技术实现高效精准的2.5D缺陷检测
  • qt+halcon开发相机拍照软件步骤
  • cs61A lab01
  • 大数据毕业设计选题推荐-基于大数据的国家医用消耗选品采集数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
  • Oracle APEX 利用卡片实现翻转
  • Spring Security AuthenticationManager 接口详解与实战
  • 人机协同的智慧共生平台:跨学科知识中心暨融智中心,从认知到实践的闭环自动转化
  • AG32 ( MCU+FPGA二合一 )是如何卷入了三相电能计量市场的
  • 2025年- H119-Lc88. 合并两个有序数组(数组)--Java版
  • 树莓派 Ubuntu 24.04 开机换源总结
  • 简单的 k8s 部署分布式Go微服务集群实例
  • 旅行社旅游管理系统的设计与实现(代码+数据库+LW)
  • Three.js shader内置矩阵注入
  • 在公用同一公网IP和端口的K8S环境中,不同域名实现不同访问需求的解决方案
  • 【MFC视图和窗口基础:文档/视图的“双胞胎”魔法 + 单文档程序】