我有一个本地Django设置如下
Django Rest Framework
:localhost:8000
AngularJS frontend
:local 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的工作正常,但这对我的服务器端数据来说是非常不安全的。
我需要更改什么才能解决此问题?
答案 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
标头的Origin
(docs)比较的格式,该标头只是主机(可能是端口)
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'
]