Django AJAX 错误:仅协议方案支持跨源请求

Posted

技术标签:

【中文标题】Django AJAX 错误:仅协议方案支持跨源请求【英文标题】:Django AJAX error: Cross origin requests are only supported for protocol schemes 【发布时间】:2016-07-19 08:17:37 【问题描述】:

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

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

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

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

$.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。那么,最佳做法是什么?

【问题讨论】:

为什么会违反 DRY? DRY 就像不要重复自己一样? 【参考方案1】:

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

<script>
    windows.ajaxUrls = 
        'billbrain-sellbill': % url 'billbrain:sellbill' %
    
</scrip>

在 js 文件中:

$.ajax(
    url : window.ajaxUrl['billbrain-sellbill'], 
    ...
);

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

【讨论】:

【参考方案2】:

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

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

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

<script>
 url_sellbill = '% url 'billbrain:sellbill' %';
 csrf_token = ' csrf_token ';
</script>

下面的代码放入你的 js 中。

$.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
        ,
    );

希望它对你有用。 :)

【讨论】:

以上是关于Django AJAX 错误:仅协议方案支持跨源请求的主要内容,如果未能解决你的问题,请参考以下文章

跨源请求仅支持协议方案错误反应

XMLHttpRequest 跨源请求仅支持协议方案反过来服务器

XMLHttpRequest 跨源请求仅支持协议方案反过来服务器

仅 Angular2 中的协议方案问题支持跨源请求

跨源请求仅支持协议方案:http、data、chrome、chrome-extension、https

跨源请求仅支持协议方案:http、data、chrome、chrome-extension、https