获取 Django POST 请求的 API

Posted

技术标签:

【中文标题】获取 Django POST 请求的 API【英文标题】:Fetch API for Django POST requests 【发布时间】:2017-11-26 10:59:46 【问题描述】:

我正在尝试从 React/Redux/Django webapp 中删除 jQuery,并将 $.ajax 方法替换为 Fetch API。我或多或少让我的所有 GET 请求工作正常,我似乎能够点击我的 POST 请求,但我似乎无法以将我的 POST 数据实际获取到 Django request.POST 的方式格式化我的请求目的。每次我点击 /sign_in 视图时,request.POST 对象都是空的。我的整个应用程序的后端都是使用 Django 表单构建的(没有 Django 模板,只有 React 控制的组件),我真的不想重写我的所有视图来使用 request.bodyrequest.data

以下是我认为相关的所有代码,如果还有更多有用的代码,请告诉我:

这是我用来构建完整 POST 数据并附加 CSRF 令牌的柯里化函数:

const setUpCsrfToken = () => 
  const csrftoken = Cookies.get('csrftoken')

  return function post (url, options) 
  const defaults = 
    'method': 'POST',
    'credentials': 'include',
    'headers': 
      'X-CSRFToken': csrftoken,
      'Content-Type': 'application/x-www-form-urlencoded'
    
  

  const merged = merge(options, defaults)
  return fetch(url, merged)
  


export const post = setUpCsrfToken()

这是我在 React 应用中使用的 API 方法:

export const signIn = data => 
  return post('/api/account/sign_in/', data)

最初打包在 React 应用程序本身中的数据就像带有字符串值的对象一样简单:


    email: 'email@email.com',
    password: 'password

我查看了这些问题,发现它们名义上很有帮助,但我无法为自己综合考虑我认为是 Django 的一些复杂性的答案:

POST Request with Fetch API? Change a jquery ajax POST request into a fetch api POST Convert javascript object into URI-encoded string Is there a better way to convert a JSON packet into a query string?

谢谢!

【问题讨论】:

遇到同样的情况,有什么解决办法吗?跳过视图更改的更好方法。 【参考方案1】:

您必须设置适当的X-Requested-With 标头。 jQuery 这样做under the hood。

X-Requested-With: XMLHttpRequest

所以,在你的例子中,你会想要这样的东西:

const setUpCsrfToken = () => 
  const csrftoken = Cookies.get('csrftoken')

  return function post (url, options) 
    const defaults = 
      'method': 'POST',
      'credentials': 'include',
      'headers': new Headers(
        'X-CSRFToken': csrftoken,
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'X-Requested-With': 'XMLHttpRequest'
      )
    

    const merged = merge(options, defaults)
    return fetch(url, merged)
  

【讨论】:

以上是关于获取 Django POST 请求的 API的主要内容,如果未能解决你的问题,请参考以下文章

从 AngularJS POST 到 Django API 以获取 JWT 并返回 405 错误

Django后台获取不到前端axios-post请求提交的参数的解决方法

django post请求 403错误解决方法

django post请求 403错误解决方法

django 获取 POST 请求值的几种方法

django 获取 POST 请求值的几种方法