如何在django和javascript之间传递csrf令牌



我对javascript知之甚少。

我有一个GeoDjango项目,正在使用传单添加一些数据的地图视图。有很多数据,所以我使用传单uGeoJSON层来显示数据(这允许传单发布一个边界框,这样Django就可以过滤结果,只传递可见数据(。

我正在为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中,但是token和header总是空的。

这是我的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 'coremap.js' %}"></script>

如果我添加了一个断点,那么在加载映射时,令牌和标头都将为空。如果我允许它继续运行,我会得到一个POST。。。403错误

在我的项目中,我使用:

var csrf_token = $('input[name="csrfmiddlewaretoken"]').val();

最新更新