Il s'agit d'un projet éducatif, non destiné à la production. Je n'avais pas l'intention d'avoir des connexions d'utilisateurs dans le cadre de ce projet.
Puis-je faire des appels POST à Django avec un jeton CSRF sans avoir de connexion d'utilisateur ? Puis-je le faire sans utiliser jQuery ? Je ne suis pas à la hauteur de la situation et j'ai sûrement confondu certains concepts.
Pour le côté JavaScript, j'ai trouvé ceci redux-csrf paquet. Je ne suis pas sûr de savoir comment le combiner avec ma POST
action en utilisant 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"));
})
}
};
Du côté de Django, j'ai lu cette documentation sur CSRF, et este sur le fait de travailler généralement avec des vues basées sur la classe.
Voici ce que j'en pense jusqu'à présent :
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]))
J'ai essayé d'utiliser le csrf_exempt
décorateur juste pour ne pas avoir à s'inquiéter de cela pour l'instant, mais cela ne semble pas être la façon dont cela fonctionne.
J'ai ajouté {% csrf_token %}
à mon modèle.
C'est mon getCookie
(volé dans la documentation de Django) :
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;
}
J'ai lu que je dois changer l'info CSRF d'Axios :
var axios = require("axios");
var axiosDefaults = require("axios/lib/defaults");
axiosDefaults.xsrfCookieName = "csrftoken"
axiosDefaults.xsrfHeaderName = "X-CSRFToken"
Où dois-je mettre le jeton réel, la valeur que j'obtiens en appelant getCookie('csrftoken')
?
0 votes
Vous devez lire la valeur du cookie "csrftoken" et définir la même valeur comme en-tête pour "X-CSRFToken". La mise en œuvre de la récupération du cookie et de la définition de l'en-tête changera si vous ne souhaitez pas utiliser Jquery, mais les principes de base restent les mêmes.