我不推荐 @yestema 的第二种方法来解决您面临的问题。
避免使用GET 方法查询您的 GraphQL 端点
如果一个人想要实现这个变通方法并且还在为mutations 使用 Graphql,那么它看起来就像一个糟糕的设计。
作为标准,GET 请求不得更改服务器或数据库的状态,mutations 在大多数情况下用于更改其中一个或另一个的状态(可能仅数据库,因为您的应用程序应该是无状态的)。
请注意,您也可以使用query 方法来更改后端的状态,但是,这又违反了既定标准,如grapqhl documentation 中所述:
[...] 在 REST 中,任何请求最终都可能对服务器造成一些副作用,但按照惯例,建议不要使用 GET 请求来修改数据。 GraphQL 是类似的——从技术上讲,任何查询都可以实现来导致数据写入。但是,建立一个约定是很有用的,即任何导致写入的操作都应通过突变显式发送。
什么时候可以安全使用 csrf_exempt 装饰器?
为了给想知道摆脱默认 CSRF 检查有多糟糕的人提供提示,这是我的两分钱解释。
当浏览器自动发送身份验证参数时,服务会受到 CSRF 攻击,这是基于会话的默认 Django 身份验证系统的情况。
如果您仅将 Django 应用程序用作 API 后端,则您可能依赖于另一种身份验证机制,例如 DRF's TokenAuthentication 或某种 JWT implementation。
基本上,这些身份验证系统不会受到 CSRF 攻击,因为如果恶意网站想要代表您的用户访问您的服务器(这就是 CSRF 的全部内容),它将无法设置 @987654331 @ 你的服务器期望的 HTTP 标头来实际验证请求(前提是你将令牌安全地存储在一个只能由你的前端应用程序域访问的 cookie 中......)。
tl;dr
继续使用 POST 请求发送您的 GraphQL 查询,这是最佳做法。
如果您的 GraphQL 端点只能由经过身份验证的用户访问,并且您的身份验证系统不依赖 Django 的会话,则可以免除您的端点进行 CSRF 检查。
但是,如果您使用 Django 的默认身份验证系统——即存储在 cookie 中的sessionid,那么您必须强制执行csrf 验证。
此时,您唯一的机会是,如先前的答案所述,在您的 HTTP 请求中添加 X-CSRFToken 标头,并为其提供先前对服务器的请求自动设置的 csrftoken cookie 的值。
我最初在GitHub 上发布了这个答案,但我认为它在这里也很有用。