Django 使用React调用REST API时出现CORS错误
我创建了一个restful api,django rest框架可以通过这个URL访问,我正在创建一个React应用程序来调用api并使用它的数据 我正在使用fetch调用apiDjango 使用React调用REST API时出现CORS错误,django,rest,reactjs,cors,django-rest-framework,Django,Rest,Reactjs,Cors,Django Rest Framework,我创建了一个restful api,django rest框架可以通过这个URL访问,我正在创建一个React应用程序来调用api并使用它的数据 我正在使用fetch调用api componentWillMount: function(){ this.setState({Problemstyle: this.props.Problemstyle}) fetch('http://192.168.33.10:8002/scenarios/') .then(result=>result.j
componentWillMount: function(){
this.setState({Problemstyle: this.props.Problemstyle})
fetch('http://192.168.33.10:8002/scenarios/')
.then(result=>result.json())
.then(result=> {
this.steState({items:result})
})
},
当我运行我的应用程序时,我的浏览器中出现了一个错误
无法加载获取API。请求的资源上不存在“Access Control Allow Origin”标头。因此,不允许访问源“”。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源
我不确定如何解决这个问题,因为我刚刚开始通过
pip Install django cors headers使用React安装django cors headers
然后,添加已安装的应用程序“corsheaders”
添加设置
CORS_ORIGIN_ALLOW_ALL = True
以及
这应该能奏效
更新
您还需要将其添加到中间件中
MIDDLEWARE = [ # Or MIDDLEWARE_CLASSES on Django < 1.10
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
MIDDLEWARE=[#或Django<1.10上的MIDDLEWARE_类
...
“corsheaders.middleware.Corsmidlware”,
'django.middleware.common.CommonMiddleware',
...
]
当前接受的答案可能会使网站面临安全风险:
为什么会发生错误:
为了让AJAX请求正常工作,需要做两件事:
django-cors-headers
。这将添加适当的标题,以便浏览器接受返回的响应。要安装或运行:
pip install django-cors-headers
并将其添加到您的中间件中:
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]
现在,您需要将发送AJAX请求的域添加到允许的域列表中:
CORS_ALLOWED_ORIGINS = [
"www.example.com",
"http://127.0.0.1:8000",
...
]
CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = (
'http//:localhost:8000',
)
那么CORS\u ORIGIN\u ALLOW\u ALL
呢?
除非您有特殊需要,否则不要使用此功能。将此设置为true意味着,任何源站都可以向您的API发出请求并获得响应。除非您正在制作一个公共API,否则您可能不需要这样做。更可能的情况是,您只需要服务一个域或几个域(可能您有一个前端,从不同的地方服务到您的API等)
如果您对任何域访问您的API感到满意,则可以设置以下内容:
CORS_ORIGIN_ALLOW_ALL = True
ALLOWED_HOSTS = ['*']
如果执行此操作,还需要设置以下各项:
CORS_ORIGIN_ALLOW_ALL = True
ALLOWED_HOSTS = ['*']
原因是Django默认情况下只接受某些主机,因此没有任何设置CORS\u ORIGIN\u ALLOW\u ALL=True
,除非您实际上要接受任何人的请求(这是上面解释的第一部分)
请注意,通过将“允许的主机”设置为通配符,您将面临HTTP主机头攻击。确保您理解这些,并确保您不受影响。你可以阅读更多关于他们的信息
另请注意:如果您没有设置
允许的\u主机
,并且您想知道为什么您的请求会工作,这是因为当DEBUG=True
自动允许某些主机时,http://127.0.0.1:8000
等使用django cors标头
首先使用pip安装django cors标头
pip install django-cors-headers
您需要将其添加到project settings.py文件中:
INSTALLED_APPS = (
##...
'corsheaders'
)
接下来,您需要将corsheaders.middleware.corsmidleware中间件添加到settings.py中的中间件类中
MIDDLEWARE_CLASSES = (
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.BrokenLinkEmailsMiddleware',
'django.middleware.common.CommonMiddleware',
#...
)
然后,您可以通过添加以下设置为所有域启用CORS
CORS_ORIGIN_ALLOW_ALL = True
或仅为指定域启用CORS:
CORS_ALLOWED_ORIGINS = [
"www.example.com",
"http://127.0.0.1:8000",
...
]
CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = (
'http//:localhost:8000',
)
需要将位于的django rest framework应用程序配置为发送Access Control Allow Origin响应头。因为当前没有返回响应头,所以浏览器不允许前端JavaScript代码访问响应。因此,您可能希望在服务器上安装这项工作是昨天完成的。今天,当我再次尝试时,它不起作用。任何提示错误是否仍然相同??检查您的设置是否正常,确保没有任何内容被覆盖。我是否也需要在js上做些什么??我正在使用axios。请不要为请求传递任何自定义标题,除非没有任何问题。您是否在已安装的应用程序中添加了“corsheaders”?更新了答案