Как передать токен csrf между django и javascript
Я очень мало знаю о javascript.
У меня есть проект GeoDjango, и я добавляю представление карты некоторых данных с помощью Leaflet. Данных очень много, поэтому я использую Leaflet uGeoJSON Layer для отображения данных (это позволяет leaflet разместить ограничивающую рамку, чтобы Django мог фильтровать результаты и передавать только видимые данные).
Я добавляю leaflet в представление django.
У меня это работает с представлением на основе функций в django, которое я украшаю @csrf_exempt, но я хотел бы передавать правильные заголовки csrf, чтобы я мог использовать общие представления django на основе классов.
В документации к [Leaflet uGeoJSON Layer][1] предлагается:
var headers = {};
// CSRF headers
var token = jQuery("meta[name='_csrf']").attr("content");
var header = jQuery("meta[name='_csrf_header']").attr("content");
if (header) {
headers[header]= token;
}
var customers = new L.uGeoJSONLayer({
endpoint : "/layers/customers",
headers: headers
}).addTo(map);
Я добавил это в свой javascript, но токен и заголовок всегда null.
Вот мой javascript.
map.js
var headers = {};
// CSRF headers
var token = jQuery("meta[name='_csrf']").attr("content");
var header = jQuery("meta[name='_csrf_header']").attr("content");
if (header) {
headers[header]= token;
}
// Point Styles
var
DmseJobStyle = {
fillColor: "#FFFFE0",
color: "#FFFF00",
opacity: 1,
fillOpacity: 0.8
}
var
...
DmseJobData = new L.uGeoJSONLayer({endpoint: "data.jobs/",
usebbox: true,
headers: headers,
pointToLayer: function (feature, latlng) {
return L.circleMarker(latlng, DmseJobStyle)
},
onEachFeature:function(feature, layer) {
layer.bindPopup('Job: ' + feature.properties.num + '</br>Desc: ' + feature.properties.desc);
}
}),
var map = L.map('map', {
center: [45.75, -64.99],
zoom: 10,
layers: [osm]
});
var overlayMaps = {
...
"DMSE Jobs": DmseJobData,
};
Это находится в файле map.js, который загружается в мой шаблон django с помощью:
<script src="{% static 'core\map.js' %}"></script>
Если я добавлю точку останова, то при загрузке карты токен и заголовок будут равны null. Если я разрешаю ему продолжать, я получаю ошибку POST ... 403
В своем проекте я использую:
var csrf_token = $('input[name="csrfmiddlewaretoken"]').val();