Django解决跨域请求的三种实用方案

Mia
Mia
发布时间:2026-10-13| 4人浏览过
原创

本文详细解析Django中处理跨域请求的三种主流方法。首先介绍通过安装django-cors-headers库进行全局配置,其次讲解利用JSONP实现GET请求跨域的原理与代码示例,最后演示如何在views.py中手动设置响应头以控制单个接口。内容涵盖配置步骤、代码实现及注意事项,帮助开发者快速解决前后端分离时的跨域限制问题。

前言

本文主要介绍了Django中解决跨域请求问题的几种常见方法,旨在为开发者提供参考与学习资源。接下来将逐一展开详细介绍。

主要包含以下几种解决方案:

  • 使用django-cors-headers库进行全局控制
  • 采用JSONP技术,但仅适用于GET请求
  • 在views.py中直接设置响应头,仅针对单个接口生效

关于django-cors-headers库

首先需要执行安装操作

pip install django-cors-headers

随后在settings.py配置文件中进行相应设置即可生效

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

MIDDLEWARE_CLASSES = (
 ...
 'corsheaders.middleware.CorsMiddleware',
 'django.middleware.common.CommonMiddleware', # 注意顺序
 ...
)
#跨域增加忽略
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = (
 '*'
)

CORS_ALLOW_METHODS = (
 'DELETE',
 'GET',
 'OPTIONS',
 'PATCH',
 'POST',
 'PUT',
 'VIEW',
)

CORS_ALLOW_HEADERS = (
 'XMLHttpRequest',
 'X_FILENAME',
 'accept-encoding',
 'authorization',
 'content-type',
 'dnt',
 'origin',
 'user-agent',
 'x-csrftoken',
 'x-requested-with',
 'Pragma',
)

配置完成后,跨域问题即告解决。

JSONP方案

在使用Ajax获取JSON数据时,浏览器会实施跨域限制。然而,通过HTML页面调用JavaScript脚本文件时不受此限制,JSONP正是利用这一特性来实现跨域数据传输。因此,我们需要将Ajax调用中的dataType参数从JSON修改为JSONP,同时确保后端API支持JSONP格式。

需要注意的是,JSONP仅支持GET请求方式。

什么是JSONP

首先了解JSON的概念。JSON是一种轻量级的数据交换格式,广泛应用于现代Web应用。目前,几乎所有主流编程语言都支持JSON数据的编码与解析,因此前后端分离架构普遍采用JSON格式进行数据传输。

那么,JSONP具体是什么呢?

这里涉及浏览器的同源策略概念。为了保障用户访问安全,现代浏览器强制实施同源策略,即禁止访问非同源页面。具体而言,在ajax请求中,不允许向非同源URL发起请求。例如,www.a.com下的页面,其ajax请求无法访问www.b.com/c.php这样的资源。

JSONP正是为了解决跨域请求问题而设计的,其具体实现机制如下:

JSONP的工作原理

由于ajax请求受同源策略限制,无法进行跨域请求,但script标签的src属性可以加载跨域的js脚本。利用这一特性,服务端不再返回标准的JSON格式数据,而是返回一段调用特定函数的JavaScript代码,并在src属性中指定该脚本地址,从而实现了跨域数据交互。

JSONP的具体实现步骤

以下是127.0.0.1:8000服务器上的index.html文件内容

<!DOCTYPE html>
<html>
<head>
<title>GoJSONP</title>
</head>
<body>
$(".jsonp_test").click(function () {
$.ajax({
url:"http://127.0.0.1:8008/service/",
type:"get",
dataType:"jsonp", // 伪造ajax 基于script
jsonp: 'callbacks',
//jsonpCallback:"alex",
success:function (data) {
console.log(data)
}
})
})
<button class='jsop_test'>测试</button>
</body> </html>

对应127.0.0.1:8080服务器上的views.py处理逻辑

import json
def jsonp_test(request):
func=request.GET.get("callbacks") #获取请求的callbacks参数
info={"name":"fuyong","age":18} #定义数据
return HttpResponse(" ('%s')"%(func,json.dumps(info))) #传json对象

在Views.py中配置响应头

修改views.py中对应的API处理函数,允许其他域通过Ajax请求数据:

def myview(request): 
 response = HttpResponse(json.dumps({“key”: “value”, “key2”: “value”})) 
 response[“Access-Control-Allow-Origin”] = “*” 
 response[“Access-Control-Allow-Methods”] = “POST, GET, OPTIONS” 
 response[“Access-Control-Max-Age”] = “1000” 
 response[“Access-Control-Allow-Headers”] = “*” 
 return response

总结

以上就是本文的全部内容,希望这些内容对大家的学习或工作有所帮助。如有任何疑问,欢迎留言交流,感谢大家对本站的支持。

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

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 算法库。