【Django restframework】django跨域问题,解决PUT/PATCH/DELETE用ajax请求无法提交数据的问题

news2024/11/17 7:44:56

【Django restframework】django跨域问题,解决PUT/PATCH/DELETE用ajax请求无法提交数据的问题


1 问题描述:

我用restframework(ModelSerializer+GenericApiView)开发了一组符合RestFul接口标准的接口,这意味着它将支持客户端发来的GET、POST、PATCH、PUT、DELETE请求,分别对某一资源进行获取、创建、部分修改、全部修改、删除操作。
在进行前后端联调的时候,我遇到了跨域问题:ccess to XMLHttpRequest at ‘http://127.0.0.1:8000/book/’ from origin ‘http://localhost:63342’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource
于是我使了用第三方库django-cors-headers,并在settings中做了一些配置。此时,GET、POST请求(简单请求)可以正常的提交与请求数据,但是PUT请求提示:net::ERR_CONNECTION_ABORTED,浏览器返回NetworkError: Failed to execute ‘send’ on ‘XMLHttpRequest’: Failed to load
在这里插入图片描述
我很困惑,并不清楚为什么跨域请求资源只允许提交GET/POST请求,因为之前我已在后端做好了一系列配置。这个问题困扰了我两天,期间我尝试了各种方法,包括自定义CORS中间件、重写ajax提交PUT请求的方式等,都没有解决PUT无法提交的问题。终于,我找到了一个办法,并且成功了。

我的服务器是Windows Server2016


2 解决办法:

2.1 解决方法综述

① 前端用POST请求替代PUT/DELETE,并且在header中定义`X-HTTP-Method-Override:PUT`
② 后端引入python第三方库`django-method-override`,它用于识别前端http请求header中的X-HTTP-Method-Override参数值,并将它与相应的视图对应起来。

2.2 解决方法实行

2.2.1 前端

前端我用的是jQuery ajax来发起PUT请求,我做了以下配置:

$.ajax({
    url: 'yourUrl',
    type: 'POST',   // 此处必须是POST
    headers: {
        'X-HTTP-Method-Override': 'PUT',  // 此处是实际的请求方式 对应后端视图可接受的请求方式
        'accept': 'application/json',  // 这也是必须的
    },
    data: JSON.stringify({
        'name': name,
        'mobile': mobile,
        'province': province,
    }),
    dataType: 'json',
    contentType: 'application/json',
    async: false,
    crossDomain: true,
    success: function (res) {
        // 成功的操作
    },
    error: function (res) {
        // 失败的操作
    }
})
2.2 后端的配置

第一步:安装django-method-override

pip install django-method-override

第二步:重写项目配置文件settings.py

INSTALLED_APPS = [
    'corsheaders',
    'method_override',  # 新增的
    # ...
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    # ...
    'django.middleware.csrf.CsrfViewMiddleware',
    'method_override.middleware.MethodOverrideMiddleware',  # 新增method_override中间件,注意在CSRF之下
    # ...
]

第三步:重启项目
成功提交,并且成功的更新了数据库。
在这里插入图片描述


目前我只尝试了PUT请求,PATCH和DELETE还未用此法进行测试。如果有问题我将回来更新这篇文章,希望能对大家解决此问题提供一些思路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1130105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

矢量图形编辑软件 illustrator 2023 mac 中文软件特点

illustrator 2023 mac是一款矢量图形编辑软件,用于创建和编辑排版、图标、标志、插图和其他类型的矢量图形。 illustrator 2023 mac软件特点 矢量图形:illustrator创建的图形是矢量图形,可以无限放大而不失真,这与像素图形编辑软…

【接口测试】Jmeter接口实战-Dubbo接口+造10W数据测试(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、Windows环境通…

Harmony 个人中心(页面交互、跳转、导航、容器组件)

个人中心 前言正文一、创建工程二、登录① 更换启动页面② 拓展修饰符③ 页面跳转④ 等待进度条 三、导航栏四、首页① 轮播图② 网格列表 五、我的① 带参数跳转 六、源码 前言 今天是1024,祝各位程序员们,钱多事少离家近,不秃也强bug黄。在…

Plooks大型视频在线一起看网站源码

在前段时间,因为想和异地的朋友一起看电影,但是发现有电影的地方没有一起看功能,有一起看功能的视频网站没有电影,所以就想自己做一个一起看网站,于是就有了Plooks。 Plooks是一个完整的视频网站,其中包括…

linux驱动的IO 模型(高级字符设备一)

IO 是英文 Input 和 Output 的首字母,代表了输入和输出。操作系统(Linux)负责对计算机的资源进行管理和对进程进行调度,应用程序运行在操作系统上,处于用户空间。应用程序不能直接对硬件进行操作,只能通过操…

uniapp把文件中的内复制到另一个文件中

使用的是Html 5的plus.io.resolveLocalFileSystemURL方法,文档:HTML5 API Reference var soursePath file:///storage/emulated/0/a/;//用于读取var removePath file:///storage/emulated/0/w/;//用于移除w这个文件夹var targetPath file:///storage/…

03初始Docker

一、初始Docker 1.什么是Docker 问题 ①大型项目组件复杂,运行环境复杂,部署时依赖复杂,出现兼容性问题。 ②开发,测试,生产环境有差异。不同的环境操作系统不同 解决 ①Docket将应用、依赖、函数库、配置一起打…

ChatGPT AIGC 完成 Excel多条件求和操作

企业产品销售额是企业在一定时间内通过销售其产品获取的收入总额。 这个指标通常用于衡量企业的销售能力、市场占有率以及企业的健康度。企业产品销售额具体的计算方法是将企业在销售商品或服务时所取得的所有收入加总而得出。 在这个过程中,通常会考虑到可能存在的退货、折…

基于nodejs+vue备忘记账系统mysql

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

上传和下载文件到google drive/Local pc

1 上传 参考:使用 Python 将文件上传到 Google 云端硬盘_迹忆客 Upload file to google drive using Python - CodeSpeedy (没起作用,但可以参考一下) 第 1 步:Google API Playground 我们可以通过搜索 Google 找到更多关于 Google API Pla…

Linux 开机启动一条PHP命令

当你开机的时候要自动的启动一条PHP命令场景:比如webman 你需要手动启动项目进程 你可以这样操作 流程: 1、准备好你要执行的命令 2、将命令写入一个服务文件 3、开机自启这个服务 实例: 1、比如这个命令 /usr/local/php/bin/php /ho…

Class类文件中的“咖啡宝贝”

Class文件是一组以8个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在文件之中,中间没有添加任何分隔符,整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。 字节码(Byte Code&am…

11、Python -- 列表去重的三种方法

目录 方法1:新列表搜集方法2:利用set集合方法3:使用itertools模块 新列表搜集法 使用set集合去重 使用itertools模块的groupby函数去重 方法1:新列表搜集 (1)创建新列表 (2)遍历源列…

Webpack 基础以及常用插件使用方法

目录 一、前言二、修改打包入/出口配置步骤 三、常用插件使用html-webpack-plugin打包 CSS 代码提取 CSS 代码优化压缩过程打包 less 代码打包图片文件 一、前言 本质上,Webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。当 webpack 处理应用程序时…

如何完善文件传输审批流程,降低企业文件安全风险?

在当今高度信息化的时代,数据的价值日益凸显。然而,如果在文件对外传输过程中缺乏必要的审批和留痕记录,可能会带来严重的安全隐患。企业面临巨额的经济损失;其次,企业的品牌形象也受到了严重损害;此外&…

FreeRTOS 任务调度和任务的状态

目录 什么是任务调度? FreeRTOS的任务调度规则是怎样的? 抢占式调度运行过程​编辑 时间片调度运行过程​编辑 任务的状态 任务调度和任务的状态案例分析 什么是任务调度? 调度器就是使用相关的调度算法来决定当前需要执行的哪个任务。…

NotePad格式化SQL语句

NotePad格式化SQL步骤 今日自己在进行导出一些后台执行的SQL语句,但是在NOTEPAD上是未排版的,想想有没有这个插件呢? 1.导入插件 进入后,输入PoorManT-SqlFormatt进行搜索 2.点击格式化SQL 3.执行效果

Constellation 介绍:Chainlink 黑客马拉松

在 2020 年,Chainlink 举办了其第一次线上黑客马拉松。当时,DeFi 作为一个类别刚刚开始蓬勃发展,而 NFT 也只是刚刚起步。这次黑客马拉松吸引了来自 45 个国家的 1,000 多名注册参与者,并收到了来自 70 个项目提交。 从那时起&am…

分库分表-ShardingSphere 4.x(2)

❤️作者简介:2022新星计划第三季云原生与云计算赛道Top5🏅、华为云享专家🏅、云原生领域潜力新星🏅 💛博客首页:C站个人主页🌞 💗作者目的:如有错误请指正,将…

软考机考 画图

文章目录 绘制 前导图绘制 双代号网络图绘制 双代号时标网络图绘制 七格图绘制 类图绘制 时序图绘制 ER 图ER模型 简介 绘制表格 绘制 前导图 第一步:先画出所有活动,将活动命名 第二步:如需调整大小,选中要调整大小的元件&#…