首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我使用angularjs和django-cors-headers,然后给出“这对于需要印前检查的跨源请求是不允许的”。

我使用angularjs和django-cors-headers,然后给出“这对于需要印前检查的跨源请求是不允许的”。
EN

Stack Overflow用户
提问于 2016-09-01 21:46:01
回答 3查看 793关注 0票数 1

我有一个引用8000端口号的Django本地服务器和一个加载2080端口号html页面的本地nginx。

我安装django-cross-header包来解决跨域错误。

django-settings.py中的跨报头配置:

代码语言:javascript
复制
CORS_ALLOW_CREDENTIALS = True


CORS_ORIGIN_ALLOW_ALL = True

  CORS_ALLOW_HEADERS = (
         'x-requested-with',
         'content-type',
         'accept',
         'origin',
         'authorization',
         'x-csrftoken'
 )

  CORS_ORIGIN_WHITELIST = (
          '127.0.0.1:2080',
          'localhost:2080'
  )

Config angularjs如下:

代码语言:javascript
复制
portman.config(function ($routeProvider, $interpolateProvider, $httpProvider) {
     $routeProvider.otherwise('/');
     $httpProvider.defaults.headers.common['X-CSRFToken'] = csrftoken;
     $interpolateProvider.startSymbol('{$').endSymbol('$}');
     delete $httpProvider.defaults.headers.common['X-Requested-With'];

 });
 portman.constant('ip','http://127.0.0.1:8000/');

在angularjs中获取方法代码是:

代码语言:javascript
复制
$http({
         method: 'GET',
         url: ip+'api/v1/dslam/events',
     }).then(function (result) {
        $scope.dslam_events = result.data;
     }, function (err) {

    });

请求头部为:显示临时头部

代码语言:javascript
复制
Accept:application/json, text/plain, */*
Origin:http://127.0.0.1:2080
Referer:http://127.0.0.1:2080/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.99 Safari/537.36
X-CSRFToken:ztouFO8vldho97bWzY9mHQioFk3j6h5V

加载页面后,我看到以下错误:

代码语言:javascript
复制
XMLHttpRequest cannot load http://127.0.0.1:8000/api/v1/dslam/events.The request was redirected to 'http://127.0.0.1:8000/api/v1/dslam/events/', which is disallowed for cross-origin requests that require preflight.

但是当我从控制台发送请求时,它会直接响应django服务器,我的jquery代码:

代码语言:javascript
复制
$.ajax({
            type: 'GET',
            url: "http://5.202.129.160:8020/api/v1/dslam/events/",
            success:function(data){
             console.log(data);
            }
        });

请求头部为:

代码语言:javascript
复制
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,fa;q=0.6,pt;q=0.4
Connection:keep-alive
Host:127.0.0.1:8000
Origin:http://127.0.0.1:2080
Referer:http://127.0.0.1:2080/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.99 Safari/537.36

请帮帮我。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-04 20:38:27

您需要将corsheaders添加到已安装的应用程序中。

代码语言:javascript
复制
INSTALLED_APPS = [
    ...,
    'corsheaders',
    ...,
]

corsmiddleware添加到中间件类。

代码语言:javascript
复制
MIDDLEWARE_CLASSES = [
    ...,
    'corsheaders.middleware.CorsMiddleware',
    ...,
]

最后,在url "/“的末尾缺少一个斜杠。此外,您应该在http请求中添加csrf令牌,以便它可以与不安全的http方法一起工作,如POST、PATCH、PUT和DELETE。

代码语言:javascript
复制
$http({
    method: 'GET',
    url: ip+'api/v1/dslam/events/',
    'X-CSRFToken' : $cookies.get('csrftoken')
}).then(function (result) {
    $scope.dslam_events = result.data;
}, function (err) {

});

为了让$cookies服务正常工作,您需要安装ngCookies angular模块,仅此而已。

票数 1
EN

Stack Overflow用户

发布于 2017-07-08 21:16:54

Try this for enabling cross origin

代码语言:javascript
复制
https://github.com/ottoyiu/django-cors-headers
票数 0
EN

Stack Overflow用户

发布于 2017-02-06 12:37:49

我和你有同样的问题。我只需要在httpd.conf和angular应用程序中添加以下设置。就是这样,通过the following steps就可以了。

代码语言:javascript
复制
<IfModule mod_headers.c>
SetEnvIf Origin (.*) AccessControlAllowOrigin=$1
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header set Access-Control-Allow-Credentials true
</IfModule> 

在angular应用程序中

代码语言:javascript
复制
angular.module('app', ['ngCookies'])
    .config([
   '$httpProvider',
   '$interpolateProvider',
   function($httpProvider, $interpolateProvider, $scope, $http) {
       $httpProvider.defaults.withCredentials = true;
       $httpProvider.defaults.xsrfCookieName = 'csrftoken';
       $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
   }]).
   run([
   '$http',
   '$cookies',
   function($http, $cookies) {
       $http.defaults.headers.post['X-CSRFToken'] = $cookies.csrftoken;
   }]);

Here是关于CORS的详细信息。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39273260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档