Django跨域资源共享(CORS)问题详解与解决方案

阿麦
阿麦
发布时间:2026-10-13| 5人浏览过
原创

本文深入解析Django前后端分离开发中常见的CORS跨域问题。详细区分简单请求与非简单请求(预检请求)机制,解析OPTIONS请求及关键响应头含义,并展示如何通过安装配置django-cors-headers库快速解决跨域访问限制,确保后端接口安全且高效地被前端调用。

Django跨域问题背景

在近期进行的前后端分离Web项目开发中,我负责后端部分,技术栈选用Django框架。在前后端集成测试阶段,遇到了涉及Web安全机制的问题,其中跨域资源共享(CORS)便是典型代表。

CORS机制解析

CORS问题概述

跨域资源共享(CORS)是一种基于额外HTTP头的安全机制,旨在允许运行在特定源(域名)上的Web应用,被授权访问来自不同源服务器的指定资源。当资源请求发起自与资源本身所在服务器不同的域、协议或端口时,即构成跨域HTTP请求。CORS机制通过允许Web应用服务器实施跨域访问控制,实现了安全的数据跨域传输。现代浏览器在API容器中使用CORS,有效降低了跨域HTTP请求带来的潜在风险。

域的判定标准由协议、主机名和端口号共同决定。简而言之,若两个URL在协议、主机或端口中任意一项存在差异,则它们属于不同的域,彼此间的访问将触发跨域限制。

在我的项目环境中,前端部署地址为 http://localhost:8001 ,后端API地址为 http://localhost:8000 。尽管两者的协议和主机名一致,但端口号不同,导致前端调用后端接口时必然遭遇跨域访问限制。

简单请求与非简单请求

简单请求机制

简单请求不会触发跨域预检流程,需同时满足以下条件:

请求方法必须为以下之一:

GET HEAD POST

请求头字段集合需仅包含以下类型:

  • Accept
  • Accept-Language
  • Content-Language
  • Content-type 仅限 text/plain 、 multipart/form-data 或 application/x-www-form-urlencoded
  • DRP
  • DownLink
  • Save-Data
  • Viewport-Width
  • Width

非简单请求处理

不满足简单请求条件的请求被视为非简单请求。此类请求在发送实际数据前,必须先发送一个预检请求(Preflight Request),HTTP方法为 OPTIONS。预检请求旨在防止跨域操作对服务器用户数据造成未预期的影响。若请求满足以下任一条件,则必须首先发送预检请求:

使用了以下HTTP方法之一:

PUT DELETE CONNECT OPTIONS TRACE PATCH

请求头中包含非简单请求允许的头部字段。

Django中的CORS解决方案

Django开发中的具体实践

在后端开发过程中,我遇到了上述跨域场景。

错误日志显示请求被CORS协议拦截。

响应中的 Origin 字段标识了请求源地址,请求使用了 OPTIONS 方法,目标 Host 指向本机地址。服务器返回了响应,但并未执行实际的业务请求。

为解决此问题,我搜索相关方案后,安装了 django-cors-headers 库并完成配置。在配置过程中,我将该中间件置于Django中间件列表的首位。再次访问相同地址,结果如下:

1. 首先,浏览器检测访问请求头,发现存在CORS安全头部集合之外的字段,因此向服务器发送预检请求。从上图可见,方法为 OPTIONS,该方法对服务器资源无副作用。请求头中的 Access-Control-Request-Method 字段表明实际业务请求将采用 GET 方法, Origin 字段表示请求源,将在服务器端进行验证。

2. 验证通过后,服务器会在响应头中添加特定字段返回,各字段含义如下:

  • Access-Control-Allow-Headers :指示服务器允许的请求头部字段。
  • Access-Control-Allow-Methods :表明服务器允许客户端使用 POST、GET 和 OPTIONS 等方法发起请求。
  • Access-Control-Allow-Origin :指示服务器允许的请求源地址。
  • Access-Control-Max-Age :表明该预检响应的有效时长为86400秒(即24小时)。在此有效期内,浏览器无需为同一请求再次发起预检。

3. 随后,客户端发出实际业务请求。从结果看,预检请求的响应体为空,而实际请求则携带了服务器返回的业务数据。由此可见,预检请求本质上是客户端与服务器之间的预先沟通,用于获取跨域访问权限信息。

总结

非简单请求需通过预检请求进行权限判断,服务端与客户端需在头部字段上达成一致,方能正常访问。在Django开发中,直接引入 django-cors-headers 库并进行基础配置,即可高效解决跨域问题。

本文关于Django跨域资源共享问题的总结到此结束。如需了解更多Django跨域相关内容,欢迎查阅本站过往文章或继续浏览后续教程,期待大家的支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。