django-cors-headers不起作用

时间:2015-01-20 13:21:52

标签: python django django-cors-headers

django-cors-headers不起作用

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.gis',
    'corsheaders',
    'rest_framework',
    'world',
    'userManager',
    'markPost',
    'BasicServices',
)


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
CORS_ALLOW_CREDENTIALS = True

一切正常,但没有效果

这里是我的回复标题

Cache-Control: max-age=0
Content-Type: text/html; charset=utf-8
Date: Tue, 20 Jan 2015 13:16:17 GMT
Expires: Tue, 20 Jan 2015 13:16:17 GMT
Last-Modified: Tue, 20 Jan 2015 13:16:17 GMT
Server: WSGIServer/0.1 Python/2.7.8
Set-Cookie: csrftoken=snXksqpljbCLW0eZ0EElFxKbiUkYIvK0; expires=Tue, 19-Jan-2016 13:16:17 GMT; Max-Age=31449600; Path=/
Vary: Cookie
X-Frame-Options: SAMEORIGIN

15 个答案:

答案 0 :(得分:12)

根据CorsMiddleware的process_response代码:

response[ACCESS_CONTROL_ALLOW_ORIGIN] = "*" if (
            settings.CORS_ORIGIN_ALLOW_ALL and
            not settings.CORS_ALLOW_CREDENTIALS) else origin

您必须设置如下设置:

# CORS Config
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = False

答案 1 :(得分:4)

我猜corsheaders和clickjacking中间件不兼容。当我评论django.middleware.clickjacking.XFrameOptionsMiddleware时,至少我摆脱了X-Frame-Options标题。

我只是CORS_ORIGIN_ALLOW_ALL = True设置。

答案 2 :(得分:4)

如果您正在测试此项,则需要确保在请求中至少包含Origin标头。

E.g:

-

您将通过预检CORS请求获得更多反馈:

<uses-permission android:name="android.permission.CAMERA" />

答案 3 :(得分:3)

不要忘记添加

  

'corsheaders.middleware.CorsMiddleware',

在MIDDLEWARS变量的顶部:

参见文档:

  

CorsMiddleware应该尽可能高,特别是之前   任何可以生成响应的中间件,例如Django   CommonMiddleware或Whitenoise的WhiteNoiseMiddleware。如果不是   之前,它将无法将CORS标头添加到这些标头中   响应。

答案 4 :(得分:3)

从Django 2 MIDDLEWARE_CLASSES更改为MIDDLEWARE。在这种情况下,如果您有Django 2,请确保MIDDLWARE应该是MIDDLEWARES执行的。

答案 5 :(得分:1)

尽管遵循了所有步骤,但是django-cors-headers对于Django 2来说不适合我。飞行前检查将重新出现405错误。

我最终写了一个小的中间件:

from django import http


class CorsMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        if (request.method == "OPTIONS"  and "HTTP_ACCESS_CONTROL_REQUEST_METHOD" in request.META):
            response = http.HttpResponse()
            response["Content-Length"] = "0"
            response["Access-Control-Max-Age"] = 86400
        response["Access-Control-Allow-Origin"] = "*"
        response["Access-Control-Allow-Methods"] = "DELETE, GET, OPTIONS, PATCH, POST, PUT"
        response["Access-Control-Allow-Headers"] = "accept, accept-encoding, authorization, content-type, dnt, origin, user-agent, x-csrftoken, x-requested-with"
        return response

然后将此中间件添加到我的settings.py中:

MIDDLEWARE = [
    'apps.core.middleware.CorsMiddleware',
     ... others below it
]

这帮了我大忙。

答案 6 :(得分:1)

django-cors-headers 非常适合处理CORS政策问题。

完成上述步骤后,只需尝试清除浏览器缓存或尝试在chrome(隐身)或firefox(专用窗口)中发出相同的请求即可。

答案 7 :(得分:1)

我尝试安装 django-cors-headers 以修复我在使用生产设置运行 django 应用程序时遇到的错误。

<块引用>

来自源“http://localhost:3000”的“URL”已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。

CORS ERROR

我的应用在开发中运行时加载良好,安装 django-cors-headers 未解决问题。出于某种原因,Chrome 在我进行生产时阻止了 Material 图标的加载。

enter image description here

一旦我发现问题是什么,我觉得分享我是如何解决它的很重要,因为我觉得很多人都会遇到同样的情况。

希望此解决方案适用于那些像我一样从另一台服务器(例如 AWS S3 存储桶)提供静态内容(例如图像)并收到此错误的人。

如果您是,并且它以同样的方式被 chrome 阻止,则安装 django-cors-headers 将无济于事。这是因为问题在于 S3 存储桶(Azure 等)的配置而不是 django 应用程序。

转到 AWS S3 控制面板,选择用于托管 django 应用程序静态文件的存储桶后,单击权限选项卡。

permissions tab of s3 bucket

向下滚动到 cross-origin resource sharing (CORS) 部分并点击“编辑”。

CORS section

如果您只想完全解决问题(仅提供被 chrome 阻止的静态文件),请输入以下 JSON,然后单击底部的“保存更改”。

[
    {
        "AllowedHeaders": [],
        "AllowedMethods": [
            "GET"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]

有关如何配置 S3 存储桶的 CORS 配置的更多信息 here



保存此配置后,错误消失,我的图标加载正确。

icons loading properly

脚注:

鉴于我也误解了 Access-Control-Allow-Origin 标头的工作原理,我在 Cross-Origin Resource Sharing 上从 Mozilla 的文档中拍摄了一张图片,但对其进行了编辑以显示我的情况,希望能解释标头的工作原理。

server client diagram

想象一下 Chrome 和 localhost 正在交换邮件,突然 chrome 开始从 AWS 接收邮件,但它没有 Chromes 名称。好人 Chrome 在想,呃我不知道我是否应该查看这些信息,它不是来自源 (localhost) 所以我不知道我是否被允许,它可能是错误发送的敏感信息.所以我不会打开它。

Allow-Access-Control-Origin 标头是 S3 在该邮件上写的“没关系,您 (Chrome) 有权查看此邮件中的信息”。

django-cors-headers 在以下情况下是必需的:您在服务器 A(源)上托管了一个应用程序,该应用程序向服务器 B 上的 django 应用程序发出请求,这不是源。例如,如果您的 django 应用程序是托管在 heroku 上的 rest api,而您在 Azure 上托管了一个 react/angular 应用程序,该应用程序向该 api 发出请求 - 那么您的 django 应用程序将需要它。

django app that needs django-cors-headers

答案 8 :(得分:1)

我花了几个小时并尝试了很多解决方案来解决这个问题。 我认为我们需要按照提到的步骤here

还有一步: 最后它在我添加后起作用了:

CORS_ALLOW_HEADERS = ['*']

之后:

ALLOWED_HOSTS=['*']

CORS_ORIGIN_ALLOW_ALL = 真

我认为它允许包括授权在内的所有标头。

答案 9 :(得分:0)

我遇到了同样的问题,一切似乎都在正确的地方。然后我发现在将MIDDLEWARE_CLASSES添加到ShowSpinner之前已经启动了服务器。进行更正后,它仍然无法正常工作。尝试了一堆东西之后,我在另一个浏览器中将其打开,并且可以正常工作。原来,我只需要清除浏览器缓存。

答案 10 :(得分:0)

最终解决方案是发送带有CORS允许的标头的响应。

package main

import "fmt"

func Item() interface{} {
    return struct {
        Name string
    }{Name: "poloxue"}
}

func ItemMap(item *interface{}) {
    *item = map[string]interface{}{
        "Name": "poloxue",
    }
}

func main() {
    m := Item()
    fmt.Printf("%T\n", m)
    ItemMap(&m)
    fmt.Printf("%T\n", m)
}

答案 11 :(得分:0)

这对我有用:

python -m pip install django-cors-headers
MIDDLEWARE = [  
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
]

INSTALLED_APPS = [
    ...
    'corsheaders',
    ...
]

`ALLOWED_HOSTS = ['*']`

`CORS_ORIGIN_ALLOW_ALL = True`

请确保包括:corsheaders.middleware.CorsMiddleware,并尽可能高

供参考:https://developers.docusign.com/esign-rest-api/guides/concepts/recipientshttps://pypi.org/project/django-cors-headers/

答案 12 :(得分:0)

我所做的是降低django-cors-headers的版本以使其正常工作。 我从版本3.2.1移至2.4.0。您可以通过使用pip安装特定版本来做到这一点

pip install django-cors-headers==2.4.0

答案 13 :(得分:0)

您是否要在iframe中使用该网址?

如果是这种情况,则标题X-Frame-Options: SAMEORIGIN可能会引起问题。

要解决此问题,请删除中间件django.middleware.clickjacking.XFrameOptionsMiddleware

答案 14 :(得分:0)

对我来说,我必须添加非标准标头。即使设置了CORS_ORIGIN_ALLOW_ALL = True,它仍会检查是否允许标题。

from corsheaders.defaults import default_headers

CORS_ALLOW_HEADERS = list(default_headers) + [
    'my-custom-header',  
]

对于非标准方法也可以这样做:

from corsheaders.defaults import default_methods

CORS_ALLOW_METHODS = list(default_methods) + [
    'POKE',
]