关于jquery:Django AJAX错误:仅支持协议方案的交叉原始请求

Django AJAX error: Cross origin requests are only supported for protocol schemes

我收到有关AJAX调用的以下错误

XMLHttpRequest无法加载billbrain:sellbill。 交叉源请求仅支持协议方案:http,data,chrome,chrome-extension,https,chrome-extension-resource。

billbrain是我的django应用程序名称,而sellbill是销售发票视图的URL名称。

以下是我的AJAX(Django)代码:

1
2
3
4
5
6
7
8
9
10
11
$.ajax({
        url :"billbrain:sellbill",
        type :"POST", d
        data : { customer_code: input }, // data sent with the post request

                // handle a successful response
        success : function(json) {
            console.log(json); // log the returned json to the console
            console.log("success"); // another sanity check
        },
    });

现在,如果明确说明会违反DRY的网址。 那么,最佳做法是什么?


您可以在包含URL的基本模板全局对象中声明并使用url模板标记:

1
2
3
4
    windows.ajaxUrls = {
        'billbrain-sellbill': {% url 'billbrain:sellbill' %}
    }
</scrip>

在js文件中:

1
2
3
4
$.ajax({
    url : window.ajaxUrl['billbrain-sellbill'],
    ...
});

或者使用https://github.com/mlouro/django-js-utils


你应该传递csrf令牌,你不能在ajax的url中这样写。 你应该写下面的代码。

如果你有内联js。 它适用于你,否则你应该将两个变量添加到渲染模板中。 因为,你不能将django的变量用于导入的JS。

这段代码只是放在模板的底部。

1
2
 url_sellbill = '{% url 'billbrain:sellbill' %}';
 csrf_token = '{{ csrf_token }}';

下面的代码放入你的js。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$.ajax({
        url : url_sellbill,
        type :"POST", d
        data : {
                customer_code: input,
                'csrfmiddlewaretoken': csrf_token,

        }, // data sent with the post request

        // handle a successful response
        success : function(json) {
            console.log(json); // log the returned json to the console
            console.log("success"); // another sanity check
        },
    });

希望它能为你效劳。:)