更新:
我正在编写一个小模块来处理骨干网中的此csrf令牌问题,直到获得@Louis答案的推送通知。
他的回答很优雅,看起来也不错,但是我将为所有需要它的人留下指向我的ribs.csrf模块github repo的链接。
================================================== ==================
我将Backbone与Django后端一起用作前端框架。
Backbone.sync
为了与Django的CSRF保护系统兼容,我必须对每个AJAX请求在发送前都设置CSRF请求标头。
由于我使用require.js进行模块化javascript开发,因此我尝试配置in shim.init
,require.config
以便在将Backbone加载到浏览器中后立即触发此覆盖:
<script>
var require = {
...
shim: {
'jquery': {'exports': 'jQuery'},
'backbone': {
'deps': ['underscore', 'jquery'],
'exports': 'Backbone',
'init': function(_, $) {
alert('NOT EVEN CALLED');
var originalSync = this.Backbone.sync;
this.Backbone.sync = function(method, model, options) {
options.beforeSend = function(xhr) {
xhr.setRequestHeader('X-CSRFToken', window.csrf_token);
}
return originalSync(method, model, options);
}
}
}
}
}
</script>
// Load require.js
<script src="require.js"></script>
尽管主干已成功加载,但未调用require配置的“ init”。
问题是什么?
查看带注释的源代码,我看到Backbonedefine
在检测到它正在使用AMD加载程序运行时调用。使用shim
与调用模块define
导致不确定的行为,因为shim
是该模块不叫define
。
您可以使用伪造的backbone
模块来实现所需的目标,并将其保存在名为backbone-glue.js
以下文件的文件中:
define(['backbone'], function (Backbone) {
var originalSync = Backbone.sync;
Backbone.sync = function(method, model, options) {
options.beforeSend = function(xhr) {
xhr.setRequestHeader('X-CSRFToken', window.csrf_token);
}
return originalSync(method, model, options);
};
return Backbone;
});
然后在RequireJS的配置中应该有一个这样的映射:
map: {
'*': {
backbone: 'backbone-glue'
},
'backbone-glue': {
backbone: 'backbone'
}
}
它的作用是在需要*
模块时到处()backbone
都需要RequireJS加载backbone-glue
。但是,在中backbone-glue
,backbone
需要时,则将backbone
其加载。这样可以backbone-glue
加载原始骨干网。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句