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

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

【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还未用此法进行测试。如果有问题我将回来更新这篇文章,希望能对大家解决此问题提供一些思路。
PATCH也已经用这种方法试过了,没有问题,可以正常提交。

相关文章:

  • 生活废品回收系统 JAVA语言设计和实现
  • R语言中fread怎么使用?
  • 单片机设计基于STM32的空气净化器设计
  • 【设计模式】模板方法模式
  • Chromium浏览器启动参数
  • 【Python】Windows跟随程序启动和关闭系统代理
  • 支持多校 微信课表小程序源码 排课小程序源码 支持导入课表 情侣课表 背景设置
  • 【零分配的 JSON 日志记录器】高性能日志框架——ZeroLog
  • MySQL几种方法的数据库备份
  • 代码随想录图论 第一天 | 797.所有可能的路径 200. 岛屿数量
  • 读书笔记之《敏捷测试从零开始》(一)
  • IOS(刘海/留海/流海)屏幕判断
  • CPU眼里的C/C++:1.2 查看变量和函数在内存中的存储位置
  • 黑豹程序员-架构师学习路线图-百科:API接口测试工具Postman
  • 【Opencv】OpenCV使用CMake和MinGW的编译安装出错解决
  • mysql全文索引
  • mybatis书写
  • 怎么保护公司文件安全
  • java中的异常,以及出现异常后的处理【try,catch,finally】
  • 多线程进阶
  • 2025年度中国青年五四奖章暨新时代青年先锋奖评选揭晓
  • 人民日报:在大有可为的时代大有作为
  • 哈莉·贝瑞、洪常秀等出任戛纳主竞赛单元评委
  • A股三大股指小幅低收:电力股大幅调整,两市成交10221亿元
  • 保利发展去年净利润约50亿元,在手现金1342亿元
  • 别让心脏“饿肚子”,心肌缺血全解析