Django Python休息框架,在Chrome中请求的资源上没有'Access-Control-Allow-Origin'标头,在firefox中工作

SPa*_*ick 15 python django google-chrome django-rest-framework django-cors-headers

我在同一个问题上研究并阅读了不少Stackoverflow帖子.没有人解决我的问题.

我的问题是我的控制台中出现了"... No'Access-Control-Allow-Origin'标头出现在所请求的资源上......"错误.

我在用:

Chrome版本57.0.2987.133 Firefox版本52.0.2

Python 2.7 Django 1.11a1

AngularJS

我正在使用MAMP来提供我的前端Angular内容,以及用于后端内容的django服务器.

在我的django设置中,我已经包含了cors中间件,并尝试了白名单方法并将所有设置为true:

MIDDLEWARE = [

    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

]

CORS_ORIGIN_ALLOW_ALL = True
Run Code Online (Sandbox Code Playgroud)

在谷歌浏览器上我仍然收到此错误:

localhost /:1 XMLHttpRequest无法加载{my endpoint url}.已从{my endpoint url}重定向到{my endpoint url with a}已被CORS策略阻止:请求的资源上没有"Access-Control-Allow-Origin"标头.因此,不允许原始{request url}访问.

它适用于Firefox,我无法弄清楚为什么它不适用于谷歌浏览器.我还没有尝试过任何其他类型的浏览器.非常感谢任何帮助,谢谢.

小智 35

安装cors-headers包

pip install django-cors-headers
Run Code Online (Sandbox Code Playgroud)

添加到已安装的应用中

INSTALLED_APPS = [
    ...
    'corsheaders',
    ...
]
Run Code Online (Sandbox Code Playgroud)

添加MIDDLEWARE时 记得添加为列表中的第一个

MIDDLEWARE = [  
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
]
Run Code Online (Sandbox Code Playgroud)

在安装的应用程序之前,此配置可供任何人访问

CORS_ORIGIN_ALLOW_ALL=True
Run Code Online (Sandbox Code Playgroud)

或者创建一个命中列表

CORS_ORIGIN_WHITELIST = [
    'google.com',
    'hostname.example.com',
    'localhost:8000',
    '127.0.0.1:9000'
]
Run Code Online (Sandbox Code Playgroud)

  • 不适用于`django 2.1.4`和`django-cors-headers 2.4.0`,它们都是在撰写本文时的最新版本。 (8认同)
  • 该问题清楚地表明他已经安装了 cors-headers 并且问题出在 Chrome 和 FF 之间 (3认同)
  • 例如,您必须添加“http://”,因为您将给出的错误是:CORS_ORIGIN_WHITELIST 中的 Origin 'localhost:3000' is Missing schema or netloc (3认同)
  • 正如@normic 所提到的,这显然不是问题的正确答案。 (3认同)

小智 12

首先检查您的请求网址。使用vue-resource时出现此问题,然后发现我在结尾或网址中缺少'/'。

  • 有同样的问题,这对我来说是修复。有关详细信息,另请参阅 '15(!) 中的这篇文章:/sf/answers/2336414601/ (2认同)
  • 这就是解决方案。应该被接受作为答案。 (2认同)
  • 这对我来说真的非常非常有帮助。谢谢。 (2认同)

Pay*_* C. 5

确保使用127.0.0.1NOTlocalhost因为在使用localhost浏览器时可能会查找 IPv6 地址...或localhost明确设置为127.0.0.1at/etc/hosts


小智 2

也许您需要看看如何调用中间件。如果它们的顺序不正确,它们可能会抛出此错误。看来您的'django.middleware.security.SecurityMiddleware'需求被推到了以下'corsheaders.middleware.CorsMiddleware'。另外,看起来您可能 CORS_ALLOW_CREDENTIALS = True还需要添加代码。

希望这可以帮助。