Django IE中fetch()的Backbone.js问题
我正在构建一个web应用程序,后端是Django,前端是Backbone.js 当我试图从服务器获取数据时,IE出现问题。当我在IE中运行HTML页面时,集合获取总是调用error func 我的代码:Django IE中fetch()的Backbone.js问题,django,internet-explorer,backbone.js,fetch,Django,Internet Explorer,Backbone.js,Fetch,我正在构建一个web应用程序,后端是Django,前端是Backbone.js 当我试图从服务器获取数据时,IE出现问题。当我在IE中运行HTML页面时,集合获取总是调用error func 我的代码: $(function(){ var Chapter = Backbone.Model.extend({}); var Chapters = Backbone.Collection.extend({ model: Chapter, url: 'http://ip.olya.iv
$(function(){
var Chapter = Backbone.Model.extend({});
var Chapters = Backbone.Collection.extend({
model: Chapter,
url: 'http://ip.olya.ivanovss.info/chapters'
});
var chapters = new Chapters();
var Router = new (Backbone.Router.extend({
routes: {
"": "choose_activity",
"/": "choose_activity"
},
choose_activity: function () {
chapters.fetch({
success: function () {
AppView.render();
},
error: function() {
alert('error');
}
});
}
}))();
var AppView = new (Backbone.View.extend({
el: '.popup',
templates: {
choose_activity: Handlebars.compile($('#tpl-activities').html())
},
render: function () {
this.$el.html(this.templates["choose_activity"]({ chapters: chapters.toJSON()}));
}
}))();
Backbone.history.start();
});
Django的观点:
def chapters(request):
chapters = list(Chapter.objects.order_by('id'))
response = HttpResponse(json.dumps(chapters, default=encode_myway), mimetype='text/plain')
if request.META.get('HTTP_ORIGIN', None) in ('http://localhost', 'http://html.olya.ivanovss.info', 'http://10.0.2.2'):
response['Access-Control-Allow-Origin'] = request.META['HTTP_ORIGIN']
return response
提前感谢IE7不支持CORS 有两种方法可以解决这个问题。简单的方法是通过API代理。我的Python已经过时了(我是Node/PHP开发人员),但我确信关于如何做到这一点的资源非常丰富。这样做的好处是您不必接触API。但这意味着您的本地服务器必须卷曲并返回来自API服务器的每个请求 第二种(也是更少的服务器密集型方式)是JSONP!JSONP的思想是,它使用您指定的URL将
附加到文档中。jQuery追加一个?callback=jquerynn
,其中NNN
是一个随机数。因此,当
加载时,它会调用jquerynn(“响应文本”)
,jQuery知道从那里解析响应。这样做的坏处在于,您必须将所有响应包装在API端(如果您刚刚开始,这非常容易,如果您已经构建了基础设施,这就不那么容易了)
JSONP令人恼火的地方在于,从本质上讲,您不能执行POST/PUT/DELETE。但如果您可以访问API,则可以模拟它:
Backbone.emulateHTTP = true;
model.save(); // POST to "/collection/id", with "_method=PUT" + header.
将JSONP与主干网集成非常简单(little secret Branche.sync使用jQuery的$.ajax()
,选项参数转发给jQuery;)
对于访问交叉原点的每个模型/集合,您可以添加一个su
var jsonpSync = function (method, model, options) {
options.timeout = 10000; // for 404 responses
options.dataType = "jsonp";
return Backbone.sync(method, model, options);
};
在每个集合和模型中,什么是跨原点的:
var MyCollection = Backbone.Collection.extend({
sync : jsonpSync
});
或者只是覆盖整个主干同步
Backbone.__sync = Backbone.sync;
var jsonpSync = function (method, model, options) {
options.timeout = 10000; // for 404 responses
options.dataType = "jsonp";
return Backbone.__sync(method, model, options);
};
Backbone.sync = jsonpSync;
在服务器端,您可以执行以下操作:返回JSONP响应(复制粘贴到此处):
哪一个?IE8和IE9仅以非标准方式(如所述)支持CORS谢谢,您的信息帮助解决了IE8中的问题。也许有一种方法可以让它在IE7中工作?也许有一些有用的提示。
def randomTest(request):
callback = request.GET.get('callback', '')
req = {}
req ['title'] = 'This is a constant result.'
response = json.dumps(req)
response = callback + '(' + response + ');'
return HttpResponse(response, mimetype="application/json")