Django Rest Framework,ajax POST 有效,但 PATCH 抛出 CSRF 失败:CSRF 令牌丢失或不正确

2023-12-31

我正在将我的项目移植到 Django Rest Framework 来为我的项目制作一个合适的 REST Api,我认为这对设计 API 并使其健壮有很大帮助,但我遇到了一个问题:

我有一个入门模型和关联的ListCreateAPIView and RetrieveUpdateDestroyAPIView意见。 我可以通过 ajax 请求成功在列表中发布一个新的条目实例并提供csrfmiddlewaretoken就像我在常规 Django 视图中所做的那样。

    POST entries/

现在我尝试使用相同的方法将补丁应用到现有实例csrfmiddlewaretoken像这样:

    PATCH entries/3

那么响应状态码是403 FORBIDDEN存在错误CSRF Failed: CSRF token missing or incorrect虽然我在 firebux 中检查过csrfmiddlewaretoken在请求数据中。

我不知道出了什么问题,也无法找出代码中的请求被拒绝的位置。

Note:我可以使用 Django Rest Framework 可浏览 api 修补该对象。

我希望有人能帮帮忙。 谢谢。 奥利维尔

EDIT

我正在深入研究代码以查看 PATCH 请求被拒绝的位置,我发现django.middleware.csrt.py下列:

        if csrf_token is None: #<--- csrf_token is defined
            # No CSRF cookie. For POST requests, we insist on a CSRF cookie,
            # and in this way we can avoid all CSRF attacks, including login
            # CSRF.
            return self._reject(request, REASON_NO_CSRF_COOKIE)

        # Check non-cookie token for match.
        request_csrf_token = ""
        if request.method == "POST": #<--- This fails but request_csrf_token is in request.DATA
            request_csrf_token = request.POST.get('csrfmiddlewaretoken', '')

        if request_csrf_token == "":
            # Fall back to X-CSRFToken, to make things easier for AJAX,
            # and possible for PUT/DELETE.
            request_csrf_token = request.META.get('HTTP_X_CSRFTOKEN', '')

第二个测试失败,因为它不是 POST 请求,但所需的信息位于 request.DATA 中。 所以看来django并不热衷于接受PATCH请求。 您认为解决这个问题的最佳方法是什么?

您是否建议使用不同的身份验证系统(Django-rest-framework 文档中有一些)?

EDIT2

我找到了一个解决方案: 我观察到可浏览的 api 实际上正在发送一个 POST 请求,但带有参数 _method="PATCH",所以我对我的 ajax 请求做了同样的事情,并且工作正常。

不知道这样的做法是否正确,欢迎大家反馈和意见!

EDIT3

因此,经过更多阅读后,我发现(我已经有点知道了..)由于某些浏览器不支持 PUT、PATCH、DELETE 等请求,因此解决方法是使用 X-HTTP-Method-Override 发送 post 请求在标题中。

因此,我认为最好的方法是执行以下操作:

$.ajax({
   headers: {
    'X-HTTP-Method-Override': 'PATCH'
   },
   type : "POST",
   ...
});

我也遇到同样的问题,学习@overlii解决问题的方法。我使用 django Rest Framework Web 界面来做put/patch,我发现HTTP Request Headers信息如下:HTTP 请求标头 https://i.stack.imgur.com/nFRvp.png

从这张图片中我们可以发现X-CSRFTOKEN标头,所以我设置 ajax 标头信息如下:

$.ajax({
        headers: {
            'X-CSRFTOKEN': '{{ csrf_token }}'
        },
        type: "PATCH",
        dataType: "json",
        url: "/api/path/",
        data: "",
        success: function(data){
                
        }
});

我用这种方式发送补丁请求,发现可以正常运行!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django Rest Framework,ajax POST 有效,但 PATCH 抛出 CSRF 失败:CSRF 令牌丢失或不正确 的相关文章

  • jQuery 不断 ping 以获得 Ajax 响应

    如何使用 jQuery 不断运行 PHP 脚本并每秒获取响应 并将鼠标上的少量数据发送到同一脚本 我真的需要添加一些随机扩展才能让这样一个简单的计时器工作吗 迭代是人类的 递归是神圣的 L 彼得 多伊奇 http www devtopics
  • 我可以在同一台 Apache 服务器上运行 Python Django 和 Ruby 吗?

    我正在使用 ModWSGI 在 Apache2 上运行 Python Django 并且我想在同一台服务器上运行 Ruby on Rails 可以这样做吗 我读到 Passenger for Ruby on Rails 也可以支持 Djan
  • 如何从 Android 应用程序调用 REST API? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是 android 新手 也是编程新手 如何从 Android 应用程序调用 REST api GET POST 请求 请给我推荐一
  • Elastic Beanstalk 上的 Django + MySQL - 查询 MySQL 时出错

    当我在 Elastic beanstalk 上托管的 Django 应用程序上查询 MySQL 时 出现错误 错误说 admin login 处出现操作错误 1045 用户 adminDB 172 30 23 5 的访问被拒绝 使用密码 Y
  • 通用开源 REST 客户端? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 从请求响应创建 PDF 不适用于 axios,但适用于本机 xhr

    为了强制从服务器下载 PDF 我尝试使用 axios 和本机 xhr 对象 原因是我必须发送post请求 因为我向服务器传递了太多数据 所以带有简单链接的选项 例如site ru download pdf对我不起作用 尽管我最终设法用 Xh
  • 如何在自定义 django 命令中抽象出命令代码

    我正在我的应用程序下编写自定义 django 命令management commands目录 目前我在该目录中有 6 个不同的文件 每个文件都有不同的命令来解决独特的需求 然而 有一些实用程序是它们所共有的 抽象出这些公共代码的最佳方法是什
  • Img src 路径以及要传递的标头参数

    我在 jsp 页面中有一个 img 标记 其中 src 路径需要传递标头参数才能获取图像 我们怎样才能实现它呢 您现在可以使用fetch https developer mozilla org en US docs Web API Fetc
  • 我如何使用 F() 对象通过 Django ORM 来执行此操作?

    我遇到过这样的模型 class Task models Model timespan models IntegerField null True blank True class Todo models Model limitdate mo
  • Django:显示管理员验证错误的自定义错误消息

    我正在使用 Django 1 2 4 我有一个模型 其中有一个需要验证的字段 当验证失败时 我想向用户显示自定义错误消息 模型编辑是在管理界面中完成的 这就是我目前正在做的事情 def clean fields self exclude N
  • Django 按小时过滤

    我找到了那个链接 http code djangoproject com attachment ticket 8424 time filters diff http code djangoproject com attachment tic
  • 如何从 Django 模型中过滤日期 > 今天或空日期的对象?

    我需要选择日期字段大于今天日期或日期字段为空的所有模型对象 我有以下代码 login required def event new request person uuid None today datetime datetime today
  • Timezone.now() 与 datetime.datetime.now()

    我什么时候应该使用 djangotimezone now 我什么时候应该使用 python 的datetime datetime now 例如 在下面的例子中INSERT哪个更有意义 Product objects create title
  • Spring Boot 自定义 ErrorAttributes http 状态未设置为响应

    继Spring Boot之后文档 http docs spring io spring boot docs current reference htmlsingle boot features error handling我定义了自己的 E
  • 扩展通用 get_context_data 的通用视图类

    我经常发现自己必须在我的许多观点的背景中添加相同的额外变量 def get context data self kwargs Call the base implementation first to get a context conte
  • 使用 django 或任何 python 模块的链接生成器

    我想为我的用户生成临时下载链接 如果我使用 django 使用 url 模式生成链接可以吗 这是正确的方法吗 因为我可能不明白某些流程是如何工作的 它会溢出我的记忆或其他东西 某种示例或工具将不胜感激 可能是一些 nginx apache
  • 写入 Django 缓存非常慢

    我曾经将数据库查询缓存在全局变量中以加快我的应用程序的速度 由于这是强烈不建议的 并且它确实产生了问题 所以我想使用任何类型的 Django 缓存 我尝试了 LocMemCache 和 DatabaseCache 但两者都需要 关于15秒设
  • 如何保护 RESTful Web 服务的安全?

    我必须实施安全RESTful Web 服务 https www ibm com developerworks webservices library ws restful 我已经使用谷歌做了一些研究 但我陷入困境 Options TLS H
  • ajax 和相对 url

    我真的不明白这个 我有以下 获取 请求 ajax url api getdirectories dataType json success function data Do stuff 这是我的临时服务器向我提供的页面 http atlas
  • 使用 jQuery 将值发送到 $_GET

    我正在使用一个 PHP 脚本 该脚本正在通过 GET 等待两个值 我正在尝试使用 jQuery 传递这两个值 而这正是我不太擅长的地方 这是我得到的代码 有人能指出我正确的方向吗 谢谢 function xrate id rating aj

随机推荐

  • Angular mat-table dataSource.paginator 和 dataSource.sort 和 dataSource.filter 未按预期工作

    更新 更改了代码以立即调用并分配dataSource 但我仍然遇到相同的结果 除了sourceData paginator工作中 这sourceData filter and sourceData sort仍然不起作用 请注意 我没有收到任
  • ftp 客户端上出现 noClassDefFound 错误:org.apache.commons.net.ftp.FTPClient

    我正在开发一个将文件发送到 url 数据库的应用程序 我一开始只是想发送一张图片 目前 我在 java io 中遇到 noclassDefFound 错误 我已经尝试更新 java 再次删除和添加 jar 文件 并且我仔细检查了我的清单以获
  • “重新启动接收器”无法正常工作 android [Xamarin.Android]

    我正在尝试实现一个广播接收器 该接收器在设备重新启动时获取广播 但无法使用以下代码工作 它应该在设备重新启动时向我发送祝酒词 广播接收器 BroadcastReceiver public class RebootReceiver Broad
  • 删除最后一个空行

    我的 csv 文件末尾有一个分段符 我尝试使用以下命令删除文件末尾的空行 sed i d combined csv 但它不起作用并且空白行仍然存在 我可以使用以下命令删除最后一行 sed i d combined csv 但是在删除最后一行
  • 错误:“x”未命名类型

    当我尝试声明类 Game 的实例时 我收到 main cpp 的编译错误 错误 游戏 未命名类型 如果可能并不重要 但我正在使用代码块 Game cpp中的相关代码 include include main h class Game pri
  • Chrome 扩展程序弹出窗口按条件显示

    我想通过点击显示弹出窗口 但前提是条件为假 单击扩展图标后台 js 后 搜索具有当前名称的选项卡 如果选项卡找到后台js继续工作 如果没有找到 我想显示带有说明的弹出窗口 无法理解如何在这种情况下仅显示弹出窗口 我可以通过 browserA
  • 正则表达式检查字符串中的连续 3 位数字

    我想要java中的正则表达式来检查字符串是否包含连续的3位数字 但问题是我的字符串可能包含 unicode 字符 如果字符串包含 unicode 字符 则应跳过 unicode 字符 跳过 AND 之后的 4 并进行检查 一些例子是 Nee
  • 如何仅使用 JavaScript 获取下一个元素?

    假设我们有这个标记 h1 some project mdash javascript html tests h1 hr p testing 123 p 我知道有 prependChild appendChild innerHTML等属性和方
  • 在 Rails 资源管道中使用字体

    我在 Scss 文件中配置了一些字体 如下所示 font face font family Icomoon src asset url icoMoon eot iefix font format embedded opentype asse
  • ffmpeg 转换 x264 [错误]:大小为 769152 的 malloc 失败

    我正在尝试将从 Android 智能手表 mp4 格式 录制的视频转换为可在所有浏览器上播放的格式 mp4 从智能手表录制的视频未在浏览器中播放 所以 我使用 ffmpeg 将其转换为可播放的 mp4 格式 但有时它会显示错误x264 er
  • keras中的加权mse自定义损失函数

    我正在处理时间序列数据 输出未来 60 天的预测数据 我目前使用均方误差作为我的损失函数 结果很糟糕 我想实现一个加权均方误差 使得早期的输出比后来的输出重要得多 加权均方根公式 因此 我需要某种方法来使用索引迭代张量的元素 因为我需要同时
  • Angular4 的 Wysiwyg 编辑器 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道与 Angular 4 兼容的免费 Wysiwyg 编辑器吗 Froala 似乎不错 但不幸的是
  • 观察事件以隐藏闪亮的操作按钮

    在我的 Shiny 应用程序中 我试图包含显示或隐藏操作按钮的逻辑 具体取决于 ui R 中是否定义了另一个用户输入 由于应用程序中存在其他一些复杂性 我无法使用 uiOutput renderUI 功能来执行此操作 我的方法是为输入创建一
  • 未能延迟初始化集合

    我正在为我的数据库开发一个安静的网络服务 我正在使用 jpa 从数据库和 spring 中检索数据以用于架构 我已经使用基本的 dao 查询 findById save 测试了该架构 并且它运行得很好 然后在 dao 实现中我添加了一个新方
  • Jquery 拖放 - 单击事件在拖放时注册

    我正在使用 jquery 拖放 可拖动元素是一个 div 其中有两个左右浮动的嵌套 div 放置时 左侧嵌套的 div 包含文本 将启用单击事件 element left click function e window open ui dr
  • 为什么在 Cassandra 启动时仍然出现 JNA 错误,即使 jna.jar 和 platform.jar 都在 lib 目录中?

    我已下载 Jna jar 和 Platform jar 并将其复制到 usr cassandra apache cassandra 1 0 7 lib 文件夹 但在 Cassandra 启动时仍然看到以下错误 我是否遗漏了什么 On cas
  • 无法在firebase控制台中显示已部署的云功能

    我尝试将云功能部署到 firebase 但我很困惑 在命令提示符和 firebase console gt project gt functions 之间 因为在命令提示符下显示部署成功但是在 功能选项卡没有任何功能 我按照以下步骤进行部署
  • 定期付款的快速结帐不适用于德国付款人

    我目前正在使用 ExpressCheckout 和 RecurringPayments 开发 PayPal 付款交易 测试软件后 德国 买家登录 paypal 确认付款后 我收到以下消息 Zurzeit k nnen wir Ihre An
  • Swift:检查字符串是否包含字符? [复制]

    这个问题在这里已经有答案了 如何检查特定的string String含有一定的character Character string contains character Example let string Hello World let
  • Django Rest Framework,ajax POST 有效,但 PATCH 抛出 CSRF 失败:CSRF 令牌丢失或不正确

    我正在将我的项目移植到 Django Rest Framework 来为我的项目制作一个合适的 REST Api 我认为这对设计 API 并使其健壮有很大帮助 但我遇到了一个问题 我有一个入门模型和关联的ListCreateAPIView