Django CORS标头白名单不起作用

时间:2019-11-08 11:04:23

标签: python django header cors

我正在开发一个由Django后端和ReactJS前端组成的现有代码库。 一切都进行了docker化,因此我在localhost:8001上运行后端,在localhost:3000上运行前端。

由于在浏览器中出现CORS错误,因此我向Django添加了django-cors-headers。但是,当我添加CORS_ORIGIN_ALLOW_ALL = True时,我收到一条错误消息

  

跨域请求被阻止:“同源起源”策略不允许读取“ http://127.0.0.1:8001/devices/”处的远程资源。 (原因:如果CORS标头“ Access-Control-Allow-Origin”为“ *”,则不支持凭据。)

因此,我添加了以下设置:

CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = (
    'http//:127.0.0.1:3000',
    'http//:127.0.0.1:8001',
)

但我却说错了

  

CORS标头“ Access-Control-Allow-Origin”丢失

为什么白名单不起作用?我在这里做错什么了吗?

2 个答案:

答案 0 :(得分:1)

在本地运行前端代码时,请在您的浏览器中安装任何跨源浏览器扩展,这将有所帮助。

,然后将白名单网址更改如下(//:应为://):

CORS_ORIGIN_WHITELIST = (
'http://127.0.0.1:3000',
'http://127.0.0.1:8001',
)

答案 1 :(得分:0)

当您拥有CORS_ORIGIN_ALLOW_ALL = True时,这将设置Access-Control-Allow-Origin: *,并且由于错误提示,同时允许所有域进行跨域请求时,您无法通过{请求。因此,如果要将标头保留为credentials,最简单的解决方法是在从前端发送CORS请求时不使用Access-Control-Allow-Origin: *标志。

如果只想允许某些域(最好),则需要先查找有效域。请记住,这些域是来自Django的原始域。您可以通过查看request.META.REMOTE_HOST来找到它们。 credentials是WSGI看到并传递的环境,如果两者之间有一些代理,它将为您提供代理链中的最后一个主机。

如果您的网络服务器使用WSGI,例如request.META,它将nginx传递给您的Django应用程序或您拥有的任何中间WSGI服务器(例如REMOTE_HOST / uWSGI),然后他们会将其传递给您的应用。


此外,在您的设置中,gunicorn中的URL格式错误; scheme和netloc之间的分隔符是CORS_ORIGIN_WHITELIST,而不是://,例如:

//: