Django 尝试返回Excel电子表格时,JSON中位于位置0的意外标记P

Django 尝试返回Excel电子表格时,JSON中位于位置0的意外标记P,django,excel,ember.js,response,Django,Excel,Ember.js,Response,我有一个emberJS应用程序,可以在其中对Django后端进行后AJAX调用。Django中的一个函数根据POST请求中的ID为一组查询项创建一个xlsx文件。它通过Django view函数没有任何问题,但是当HTTP响应返回到ember时,我得到了错误 SyntaxError: Unexpected token P in JSON at position 0 at parse (<anonymous>) at ajaxConvert (jquery.js:878

我有一个emberJS应用程序,可以在其中对Django后端进行后AJAX调用。Django中的一个函数根据POST请求中的ID为一组查询项创建一个xlsx文件。它通过Django view函数没有任何问题,但是当HTTP响应返回到ember时,我得到了错误

SyntaxError: Unexpected token P in JSON at position 0
    at parse (<anonymous>)
    at ajaxConvert (jquery.js:8787)
    at done (jquery.js:9255)
    at XMLHttpRequest.<anonymous> (jquery.js:9548)
    at XMLHttpRequest.nrWrapper (base-content:20)
EmberJS代码

file_path = '/User/path_to_spreadsheet/content.xlsx'
fsock = open(file_path, "rb")

response = HttpResponse(fsock, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename="content.xlsx"'
return response
export default Controller.extend({
  actions: {
    storeProductId(products) {
      let product_ids = []

      products.forEach(function(product){
        product_ids.push(product.id)
      });

      let adapter = this.store.adapterFor('product-export');
      adapter.export_products(product_ids).then(function(response){
        console.log(response)
      }).catch(function(response) {
        console.log('ERROR')
        console.log(response)
      })
    }
  }
});
export default ApplicationAdapter.extend(FormDataAdapterMixin, {
  export_products(products) {
    let url = this.buildURL('unified-product');
    url = `${url}export/`;
    return this.ajax(url, 'POST', { data: {'products': products} });
  }
});
产品导出适配器代码

file_path = '/User/path_to_spreadsheet/content.xlsx'
fsock = open(file_path, "rb")

response = HttpResponse(fsock, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename="content.xlsx"'
return response
export default Controller.extend({
  actions: {
    storeProductId(products) {
      let product_ids = []

      products.forEach(function(product){
        product_ids.push(product.id)
      });

      let adapter = this.store.adapterFor('product-export');
      adapter.export_products(product_ids).then(function(response){
        console.log(response)
      }).catch(function(response) {
        console.log('ERROR')
        console.log(response)
      })
    }
  }
});
export default ApplicationAdapter.extend(FormDataAdapterMixin, {
  export_products(products) {
    let url = this.buildURL('unified-product');
    url = `${url}export/`;
    return this.ajax(url, 'POST', { data: {'products': products} });
  }
});

默认情况下,Ember Data会对应该如何处理事情做出一些假设(包括您将收到返回的JSON数据)。您使用Ember数据而不是使用对后端的直接Ajax调用有什么原因吗?看起来这将大大简化这里的事情…

您能同时显示“产品导出”适配器代码吗?嘿,Igor,我在问题的底部添加了产品导出适配器代码。