Django Rest Framework:XML​​HttpRequest无法加载http://127.0.0.1:8000/xyz/api/abc

try*_*arn 1 python django rest cors angularjs

解决方案:在网址末尾添加一个尾部斜杠...

" http://127.0.0.1:8000/xyz/api/abc/ "而不是" http://127.0.0.1:8000/xyz/api/abc "

....

我已经成功创建了一个Django Rest API,并且能够在本地存储和托管数据.我已经单独构建了一个angularjs1.0应用程序,并试图通过$ http get request提取数据但是我遇到了这个错误:

XMLHttpRequest cannot load http://127.0.0.1:8000/xyz/api/abc. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://172.20.9.163:8080' is therefore not allowed access.
Run Code Online (Sandbox Code Playgroud)

我试图安装CORS并将其添加到我的INSTALLED_APPS中,但似乎没有任何工作.

这是获取请求:

getABC : function() {
            $http({
                method: 'GET',
                url: 'http://127.0.0.1:8000/xyz/api/abc',
                cache: false
            }).success(function(data) {
                console.log(data)
                callback(data);
            });
        },
Run Code Online (Sandbox Code Playgroud)

这是我的Django settings.py文件:

INSTALLED_APPS = (
    'xyz',
    'corsheaders',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

)

CORS_ORIGIN_ALLOW_ALL = True
Run Code Online (Sandbox Code Playgroud)

Igo*_*ush 9

TL; DR

将您的AJAX请求发送到斜杠附加的URL.

说明

在我们的讨论之后,看起来罪魁祸首是Django的自动APPEND_SLASH = True,它在启用时CommonMiddleware启用.

这会导致Angular应用程序的AJAX请求首先301 Moved Permanently重定向到斜杠附加的URL.但是,corsheaders中间件不会对此响应起作用,因此浏览器会抱怨缺少Access-Control-Allow-Origin标头.

这是通过直接请求斜杠附加的URL并完全绕过301重定向来解决的.

$http({
    method: 'GET',
    url: 'http://127.0.0.1:8000/xyz/api/abc/',  // trailing slash here
    cache: false
}).success(...);
Run Code Online (Sandbox Code Playgroud)