gpt4 book ai didi

django - Restangular 因 promise 和跨域请求而失败

转载 作者:行者123 更新时间:2023-12-02 02:23:49 25 4
gpt4 key购买 nike

我正在阅读有关 Restangular 的内容,到处都提到 Restangular promise 和 Angular 可以智能地工作,并且模板在这样的情况下会更新:

As Angular supports setting promises to scope variables as soon as we get the information from the server, it will be shown in our template

$scope.something = Restagular.one('something').get();

我正在尝试做同样的事情,但 Restangular 已提供服务,因为我想保持 Controller 清洁。当我向 REST API 发出请求时,Angular 模板未更新,并且收到此错误:

XMLHttpRequest cannot load http://localhost:3000/api/template/1. The request was redirected to 'http://localhost:3000/api/template/1/', which is disallowed for cross-origin requests that require preflight.

这是我的代码:在服务中...

myAppServices.service('TemplateService', ['$http', '$cookies', '$cookieStore', Restangular',
function($http, $cookies, $cookieStore, Restangular) {

Restangular.setBaseUrl(constants.serverAddress);

var getTemplate = function(templateId) {
// Check the input
if (!isValidId(templateId))
return;

return Restangular.one('api/template', templateId).get();
};

// Public getters
this.getTemplate = getTemplate;
}]);

在 Controller 中..

$scope.currentCard =  TemplateService.getTemplate(1);

那么在这种情况下问题出在哪里——在客户端还是在服务器上。对于我的 API,我使用 django-rest-framework但当我获取包含所有模板的列表(没有特定 ID)时,我没有遇到任何问题。

我知道我可以尝试从服务及其 .then() 返回一个 promise 来设置我的作用域变量,但在 Restangular 的官方存储库中提到了这一点,我想使用它,因为代码仍然干净。

最佳答案

您遇到的问题是因为 Django 会自动将不带斜杠的 url 重定向到带斜杠的 url。正如我最近发现的那样,这不是特定于框架的 it is an issue for ExtJS as well .

因为您请求的网址 api/templates/1 没有尾部斜杠,并且 API 正在 api/templates/1/ 上提供,所以 Django 会自动重定向从一个位置到另一位置的请求。通常这个问题是一个问题,你只是在控制台中看到重定向发生,没有人关心,但 CORS 要求你拥有你请求的网址的权限,这意味着它无法重定向。

您可以通过两种不同的方式解决此问题:在客户端或在服务器端。

<小时/>

如果您想在客户端修复此问题,并保持服务器需要斜杠,则需要告诉 reangular 在末尾添加斜杠。 Restangular allows you to do this通过设置

RestangularProvider.setRequestSuffix('/');

在您的代码中,这将告诉 resangular 始终添加尾部斜杠。

<小时/>

如果您想在服务器端修复此问题,则需要停止在 API 中要求斜杠。这会产生令人不快的副作用,即不允许任何带有斜线的请求,并且可能会破坏按预期工作的现有应用程序。 Django REST Framework allows you to do this on the router level通过在初始化路由器时设置trailing_slash=False

router = SimpleRouter(trailing_slash=False)

这将告诉 Django REST Framework 注册所有不带尾部斜杠的 URL。

关于django - Restangular 因 promise 和跨域请求而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22691556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com