Django Localhost CORS无法正常工作

时间:2016-01-10 03:13:29

标签: python angularjs django cors django-cors-headers

我有一个本地Django设置如下

Django Rest Frameworklocalhost:8000

AngularJS frontendlocal apache running on http://localservername

我已经安装了django-cors-headers,而在settings.py,我设置了

CORS_ORIGIN_WHITELIST = (
    'http://localhost',
    'localservername',
    'http://localservername',
    '127.0.0.1'
)


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',
)

但是,每当我点击No 'Access-Control-Allow-Origin' header is present on the requested resource.提供的任何API时,都会收到Rest Framework错误。如果我设置CORS_ORIGIN_ALLOW_ALL = True,那么API的工作正常,但这对我的服务器端数据来说是非常不安全的。

我需要更改什么才能解决此问题?

11 个答案:

答案 0 :(得分:4)

对我来说,我使用[]代替()。 另外,请勿在结尾网址中添加“ /”。

类似这样的东西

CORS_ORIGIN_WHITELIST = [
    'http://localhost:3000'
]

答案 1 :(得分:2)

根据http://www.w3.org/Security/wiki/Same_Origin_Policy,请求应来自同一端口,方案和主机,以视为同一来源。这里有一台服务器在80端口,另一台在8080上。

  

原点由URL的方案,主机和端口定义。通常   说,从不同的起源检索的文件是隔离的   彼此。例如,如果从中检索文档   http://example.com/doc.html尝试访问文档的DOM   从https://example.com/target.html检索,用户代理将   禁止访问,因为第一个文档的来源,(http,   example.com,80),与第二个文档的来源不匹配   (https,example.com,443)。

答案 2 :(得分:1)

括号对我来说很重要,请使用[]代替(), 我已经在Django中验证过, 其他我还没有检查过的东西。

这样写:

CORS_ORIGIN_WHITELIST = [     'https://localhost:3000' ]

答案 3 :(得分:1)

这对我有用,请进行检查,这可能会帮助您解决问题。

CORS_ORIGIN_WHITELIST = (
    'http://localhost',
)

答案 4 :(得分:0)

我遇到了同样的问题。通过浏览django-cors-headers - 代码发现我的错误如下:

虽然完整的CORS标头看起来像这样(注意架构AND主机名):

Access-Control-Allow-Origin: https://example.com

CORS_ORIGIN_WHITELIST设置希望它采用与urlparse.netloc标头的Origindocs)比较的格式,该标头只是主机(可能是端口)

def origin_found_in_white_lists(self, origin, url):
    return (
        url.netloc in conf.CORS_ORIGIN_WHITELIST or
        (origin == 'null' and origin in conf.CORS_ORIGIN_WHITELIST) or
        self.regex_domain_match(origin)
    )

RegEx白名单将其与完整的Origin - 标题进行比较。

因此,正确的设置(如设置手册中的示例正确说明,但没有正确描述)将是:

CORS_ORIGIN_WHITELIST = (
    'example.com',
)

如果您不希望您的API与网站的非安全http版本对话,那么这可能是一个问题。在这种情况下使用RegEx。

另请注意:在排除故障时,我发现如果找不到匹配项,则CORS标头完全不存在。这意味着没有标头不能确定中间件完全出现故障,但可能只是配置错误。

答案 5 :(得分:0)

也许括号很重要

[]代替()

CORS_ORIGIN_WHITELIST = [

    'http://localhost',

    'localservername',

    'http://localservername',

    '127.0.0.1'

]

应该工作

答案 6 :(得分:0)

CORS_ORIGIN_WHITELIST = ['https://localhost:3000']很好。

答案 7 :(得分:0)

在此错误中,提示明确提到它需要https://

HINT: Add a scheme (e.g. https://) or netloc (e.g. example.com).

此外,在Django设置中,括号也很重要。

CORS_ORIGIN_WHITELIST = [
    'https://localhost:3000'
]

上面的设置工作正常。

相同的设置在不同的括号中不起作用

CORS_ORIGIN_WHITELIST = (
    'https://localhost:3000'
)

答案 8 :(得分:0)

写像 CORS_ORIGIN_WHITELIST = ['https://localhost:3000'] 对我来说很好。

答案 9 :(得分:0)

django-cors-headers documentation复制白名单代码,然后对其进行修改:

CORS_ORIGIN_WHITELIST = [
    "https://example.com",
    "https://sub.example.com",
    "http://localhost:8080",
    "http://127.0.0.1:9000"
]

这将确保您没有打错任何文字。

答案 10 :(得分:0)

确保不要添加路径 / ,如下所示:

CORS_ORIGIN_WHITELIST = (
    'https://localhost:3000/'
)

只需添加以下代码即可。

CORS_ORIGIN_WHITELIST = [
    'https://localhost:3000'
]