Django React axios发布请求:如何获取csrftoken cookie?

时间:2018-05-26 15:01:14

标签: python django reactjs csrf axios

我使用Django rest框架作为我的后端(api),并使用React作为前端。

现在我想将表单数据发布到后端。出于安全考虑,我想使用csrf保护。因此,我尝试使用Django发送的csrf Cookie为我的axios请求手动设置csrftoken标头。

For this I am using the method as recommended in the Django documentation: Link

我遇到的问题是我需要在我的机器上使用cookie才能将其添加到标题中,而且我不知道如何让Django返回cookie。

主要问题:如何在我的机器上获取csrftoken Cookie? (虽然React在没有(最初)需要与Django后端进行任何通信的情况下呈现表单)

另外,如果您发现我的代码有任何问题,我想知道。

我的代码

这是我当前的代码,我将描述我尝试过的事情:

django views.py:

from django.views.decorators.csrf import ensure_csrf_cookie


@ensure_csrf_cookie
def contact(request):
    if request.method == "POST":
        print(request.data)
    if request.method == "GET":
        return request

最初,我只有上述功能的POST部分。但是由于Django似乎没有向我发送csrftoken cookie,我尝试使用GET为视图添加功能以获取该cookie。 (我也试过返回一个HttpResponse(""),没有效果)。

我怎么知道我没有饼干? 我正在使用Chrome,转到设置>高级>内容设置>饼干>查看所有Cookie和网站数据

我在这里检查" 127.0.0.1",因为React运行在" 127.0.0.1:3000" (和Django在" 127.0.0.1:8000")。

最初,我确实看到了一个名为' csrftoken&#39的cookie,看起来就像我需要的那个。即使我的代码不起作用,我也无法将数据发布到后端。然后我删除了cookie,从那时起我无法取回它。

稍后添加: 我还检查了我是否使用Chrome开发工具(在应用程序> Cookie下)看到了cookie。

我的axios请求:

var axios = require('axios')
var jQuery = require('jquery')


module.exports = {
  ...
  submitForm: function(bodyFormData) {
    console.log("api.submitForm executes")
    axios({
      method: 'post',
      url: 'http://127.0.0.1:8000/customer/contact/',
      data: bodyFormData,
      config: { headers: {'Content-Type': 'multipart/form-data' }},
      headers: {"X-CSRFToken": this.getCookieValue('csrftoken')}
    })
      .then(function(response) {
        console.log('response success, response + data:')
        console.log(response)
        console.log(response.data)
        return response.data
      })
      .catch(function(response) {
        console.log('response error, response + data:')
        console.log(response)
        console.log(response.data)
      })
  },

  getCookieValue: function(name) {
    this.getCSRFCookie()
    let cookieValue = null
    if (document.cookie && document.cookie !== '') {
      let cookies = document.cookie.split(";")
      for (let i = 0; i < cookies.length; i++) {
        let cookie = jQuery.trim(cookies[i])
        if (cookie.substring(name.length + 1) === (name + '=')) {
          cookieValue = decodeURIComponent(cookie.substring(name.length + 1))
          break
        }
      }
    }
    console.log("cookieValue: " + cookieValue)
    return cookieValue
  },

  getCSRFCookie: function() {
    console.log("getCSRFCookie")
    axios.get('http://127.0.0.1:8000/customer/contact/')
  }
}

在查看上面的代码时,我发现即使cookie被发送,也可能会出现问题。我可以想象,获取cookie的请求还没有完成,而正在执行对后端的表单数据的POST请求。

也许我可以通过执行在加载表单时获取cookie的请求来解决这个问题,而不是在发送时。但我现在主要担心的是首先访问cookie。

提前致谢!

1 个答案:

答案 0 :(得分:0)

npm软件包django-react-csrftoken可能会对您有所帮助。将其用作表单中的组件。

import React from 'react';
import DjangoCSRFToken from 'django-react-csrftoken'

class MyLoginForm extends React.Component {
  render(){
    return (
      <div className="container">
          <form>
            <DjangoCSRFToken/>
            // xyz
            // submit button
          </form>
      </div>
    )
  }
}

按照here所述,用ensure_csrf_cookie装饰相应的django视图。