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
答案 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”标头。
我的应用在开发中运行时加载良好,安装 django-cors-headers
未解决问题。出于某种原因,Chrome 在我进行生产时阻止了 Material
图标的加载。
一旦我发现问题是什么,我觉得分享我是如何解决它的很重要,因为我觉得很多人都会遇到同样的情况。
如果您是,并且它以同样的方式被 chrome 阻止,则安装 django-cors-headers
将无济于事。这是因为问题在于 S3 存储桶(Azure 等)的配置而不是 django 应用程序。
转到 AWS S3 控制面板,选择用于托管 django 应用程序静态文件的存储桶后,单击权限选项卡。
向下滚动到 cross-origin resource sharing (CORS)
部分并点击“编辑”。
如果您只想完全解决问题(仅提供被 chrome 阻止的静态文件),请输入以下 JSON,然后单击底部的“保存更改”。
[
{
"AllowedHeaders": [],
"AllowedMethods": [
"GET"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": []
}
]
有关如何配置 S3 存储桶的 CORS 配置的更多信息 here。
保存此配置后,错误消失,我的图标加载正确。
脚注:
鉴于我也误解了 Access-Control-Allow-Origin
标头的工作原理,我在 Cross-Origin Resource Sharing 上从 Mozilla 的文档中拍摄了一张图片,但对其进行了编辑以显示我的情况,希望能解释标头的工作原理。
想象一下 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 应用程序将需要它。
答案 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/recipients,https://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',
]