我正在开发一个由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”丢失
为什么白名单不起作用?我在这里做错什么了吗?
答案 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
,而不是://
,例如:
//: