CSRF с Django, React + Redux с использованием Axios

Это образовательный проект, а не для производства. Я не собирался иметь пользовательские логины как часть этого.

Могу ли я делать POST-вызовы в Django с токеном CSRF, не имея пользовательских логинов? Могу ли я сделать это без использования JQuery? Я здесь вне своей глубины и, конечно, смешиваю некоторые понятия.

Что касается JavaScript, я нашел этоперевождь-CSRF пакет. Я не уверен, как совместить это с моимPOST действие с использованием Axios:

export const addJob = (title, hourly, tax) => {
  console.log("Trying to addJob: ", title, hourly, tax)
  return (dispatch) => {
    dispatch(requestData("addJob"));
    return axios({
      method: 'post',
      url: "/api/jobs",
      data: {
        "title": title,
        "hourly_rate": hourly,
        "tax_rate": tax
      },
      responseType: 'json'
    })
      .then((response) => {
        dispatch(receiveData(response.data, "addJob"));
      })
      .catch((response) => {
        dispatch(receiveError(response.data, "addJob"));
      })
  }
};

На стороне Джанго, я прочиталэта документация на CSRF иэтот в основном работать с представлениями на основе классов.

Вот мой взгляд на данный момент:

class JobsHandler(View):

    def get(self, request):
        with open('./data/jobs.json', 'r') as f:
            jobs = json.loads(f.read())

        return HttpResponse(json.dumps(jobs))

    def post(self, request):
        with open('./data/jobs.json', 'r') as f:
            jobs = json.loads(f.read())

        new_job = request.to_dict()
        id = new_job['title']
        jobs[id] = new_job

        with open('./data/jobs.json', 'w') as f:
            f.write(json.dumps(jobs, indent=4, separators=(',', ': ')))

        return HttpResponse(json.dumps(jobs[id]))

Я пытался использоватьcsrf_exempt просто декоратору не нужно сейчас об этом беспокоиться, но похоже, что это не так.

я добавил{% csrf_token %} на мой шаблон.

Это моеgetCookie метод (украденный из Django docs):

function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = cookies[i].trim();
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

я прочел что мне нужно изменить информацию Axios CSRF:

var axios = require("axios");
var axiosDefaults = require("axios/lib/defaults");

axiosDefaults.xsrfCookieName = "csrftoken"
axiosDefaults.xsrfHeaderName = "X-CSRFToken"

Где я могу вставить настоящий токен, значение, которое я получаю от вызоваgetCookie('csrftoken')?

Ответы на вопрос(8)

Ваш ответ на вопрос