Python Eve:请求的资源上没有“Access-Control-Allow-Origin”标头

时间:2015-01-14 18:51:31

标签: python angularjs api eve

我使用Python EVE框架编写了一个API。尝试从AngularJS应用程序访问API时,它显示错误,如下所示:

XMLHttpRequest cannot load http://127.0.0.1:5000/user/jay3dec. Request header field Authorization is not allowed by Access-Control-Allow-Headers. 

为了纠正上述错误,我将以下内容添加到settings.py

X_DOMAINS = '*'
X_HEADERS = 'Authorization'

现在上述错误消失,控制台中显示一个新错误:

XMLHttpRequest cannot load http://127.0.0.1:5000/user/jay3dec. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8000' is therefore not allowed access. 

但我已经在我的settings.py中添加了X_DOMAINS = '*'

这是angularjs代码:

    $scope.validate = function() {

    var encodedUserNameAndPassword = Base64.encode($scope.username + ':' + $scope.password);

    $http.defaults.headers.put = {
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
        'Access-Control-Allow-Headers': '*'
    };
    $http.defaults.headers.common['Authorization'] = 'Basic ' + encodedUserNameAndPassword;

    $http({
        method: 'GET',
        url: 'http://127.0.0.1:5000/user/jay3dec'
    }).
    success(function(data, status, headers, config) {
        console.log(data);
    }).
    error(function(data, status, headers, config) {
        alert(data);

    });
}

任何可能出现问题的地方

4 个答案:

答案 0 :(得分:4)

FWIW,我有类似的问题。

然后我了解到只有模式定义的API才能获得X_DOMAINS标头的效果。您使用$app = Eve(settings=blah)之类的内容自行定义的api不受X_DOMAINS标头的影响。所以,在这种情况下,你需要编写自己的装饰器。

答案 1 :(得分:2)

你必须将eve配置为。

X_DOMAINS = '*'
X_HEADERS = ['Authorization','Content-type']
and angular as 
$http.defaults.headers.common['Authorization'] = 'Basic ' + auth;

这对我有用。

答案 2 :(得分:1)

只有在

时,Eve才会触发CORS响应
  • 请求包含Origin标题
  • X_DOMAIN已在您的配置文件(settings.py
  • 中设置

由于后一种情况似乎已经满足,我会确保该请求是一个正确的CORS请求,它包含一个Origin标题。

阅读以下评论后更新 我认为Postman限制了Origin标题。请尝试使用curl:

curl -H "Origin: http://example.com" --verbose http://localhost:5000

X_DOMAIN设置为*,该请求应返回类似内容:

< HTTP/1.0 200 OK
< Content-Type: application/json
< Content-Length: 141
< Access-Control-Allow-Origin: http://example.com
< Vary: Origin
< Access-Control-Allow-Headers:
< Access-Control-Expose-Headers:
< Access-Control-Allow-Methods: HEAD, OPTIONS, GET
< Access-Control-Allow-Max-Age: 21600
< Server: Eve/0.5 Werkzeug/0.9.6 Python/2.7.8
< Date: Thu, 15 Jan 2015 08:41:08 GMT

如果这样可行,那么服务器正在正确地提供CORS请求。然后,您可以根据需要调整X_HEADERS和其他CORS服务器端设置。

答案 3 :(得分:0)

此外,您需要在AngularJS应用上打开CORS

var myApp = angular.module('myApp', [
    'myAppApiService']);

myApp.config(['$httpProvider', function($httpProvider) {
        $httpProvider.defaults.useXDomain = true;
        delete $httpProvider.defaults.headers.common['X-Requested-With'];
    }
]);

支持CORS的服务器必须响应具有多个访问控制头的请求:

Access-Control-Allow-Origin: "*"

默认情况下,CORS请求不是使用Cookie进行的。如果服务器包含此标头,那么我们可以通过将withCredentials选项设置为true来发送cookie以及我们的请求。

Access-Control-Allow-Credentials (optional)

如果我们在请求中将withCredentials选项设置为true,但服务器没有响应此标头,则请求将失败,反之亦然。