Python django cors收割台不工作

Python django cors收割台不工作,python,django,django-cors-headers,Python,Django,Django Cors Headers,django cors收割台不工作 INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.gis',

django cors收割台不工作

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

根据来自以下方面的流程响应代码:

必须设置如下设置:

# CORS Config
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = False

我猜corsheaders和clickjacking中间件是不兼容的。至少我在注释掉django.middleware.clickjacking.xframeoptions中间件时去掉了X-Frame-Options标题


我刚刚设置了
CORS\u ORIGIN\u ALLOW\u ALL=True

如果要测试此设置,则需要确保在请求中至少包含ORIGIN头

例如:

您将通过飞行前CORS请求获得更多反馈:

$ http OPTIONS http://127.0.0.1:8000/todos/ Origin:http://www.someorigin.com
HTTP/1.0 200 OK
Access-Control-Allow-Headers: x-requested-with, content-type, accept, origin, authorization, x-csrftoken, user-agent, accept-encoding
Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS
Access-Control-Allow-Origin: *
Access-Control-Max-Age: 86400
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Date: Sat, 14 Nov 2015 04:45:37 GMT
Server: WSGIServer/0.1 Python/2.7.10
Vary: Accept, Cookie
X-Frame-Options: SAMEORIGIN
别忘了加上

“corsheaders.middleware.Corsmidlware”

在中间件变量的顶部:

见文件:

Corsmidlware应尽可能放置在高处,尤其是在 任何可以生成响应的中间件,如Django的 CommonMiddleware或Whitenoise的WhiteNoiseMiddleware。如果不是 在此之前,它将无法将CORS标头添加到这些 答复


从Django 2中间件_类更改为中间件。在这种情况下,如果您有Django 2,请确保MIDDLWARE是应该的,以便执行中间件

我遇到了同样的问题,一切似乎都在正确的地方。然后我发现我在将
corsheaders.middleware.corsmidleware添加到
中间件类之前启动了服务器。修正后,它仍然不起作用。在尝试了很多东西之后,我在另一个浏览器中打开了它,它工作了。因此,我只需要清除浏览器缓存。

最终解决方案是使用CORS允许的标题发送响应

response["Access-Control-Allow-Origin"] = "*"
response['Content-Type'] = "application/json; charset=utf-8"
response["Access-Control-Allow-Origin"] = "*"
response["Access-Control-Allow-Methods"] = "GET, OPTIONS"
response["Access-Control-Max-Age"] = "1000"
response["Access-Control-Allow-Headers"] = "X-Requested-With, Content-Type, My-Token"

不管怎样,
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
然后在my
settings.py中添加了此中间件:

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

这对我来说是个好办法。

django cors headers非常适合处理cors策略问题

完成上述步骤后,只需尝试清除浏览器缓存,或尝试在chrome(匿名)或firefox(私人窗口)中发出相同的请求。

这对我很有效:

python-m pip安装django-cors头文件
中间件=[
...
“corsheaders.middleware.Corsmidlware”,
'django.middleware.common.CommonMiddleware',
...
]
已安装的应用程序=[
...
“护卫舰”,
...
]
`允许的_主机=['*']`
`CORS\u ORIGIN\u ALLOW\u ALL=True`
确保包括:
corsheaders.middleware.corsmidleware
,尽可能高


作为参考:,

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

pip install django-cors-headers==2.4.0

您是否试图在
iframe
中使用url

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


要修复它,请删除中间件,
django.middleware.clickjacking.xframeoptions中间件

我必须添加非标准头。即使设置了
CORS\u ORIGIN\u ALLOW\u 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',
]

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

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

在开发中运行时,我的应用程序可以正常加载,安装
django-cors-headers
无法解决此问题。由于某种原因,当我在生产时,chrome阻止了
材料
图标的加载

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

这个解决方案有望适用于那些从另一台服务器(比如像我一样的AWS S3 bucket)提供静态内容(比如图像)并出现此错误的用户。 如果您是,并且它正以同样的方式被chrome阻止,那么安装
django cors headers
不会有任何作用。这是因为问题在于S3 bucket(Azure等)的配置,而不是django应用程序

转到AWS S3仪表板,选择用于承载django应用程序静态文件的存储桶后,单击权限选项卡

向下滚动到
跨源资源共享(CORS)
部分,然后单击“编辑”

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

[
{
“AllowedHeader”:[],
“允许的方法”:[
“得到”
],
“允许的来源”:[
"*"
],
“曝光者”:[]
}
]
有更多关于如何配置S3存储桶的CORS配置的信息



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

脚注:

考虑到我也误解了
访问控制允许源代码
标题的工作原理,我从Mozilla的文档上拍摄了一张图片,但对其进行了编辑,以显示我的情况,希望能够解释标题的工作原理

想象一下,Chrome和localhost正在交换邮件,突然Chrome开始从AWS接收邮件,但它没有Chrome的名称。好人Chrome在想,呃,我不知道
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',
]