我正在运行一个React前端和一个Flask后端。我什么都不懂。
让我们来谈谈CORS。 CORS是跨域资源共享。那么,当我在同一主机上同时运行前端和后端时,为什么Chrome会抱怨CORS?
因此,我在Flask后端上启用了CORS,并以快乐的方式继续。
我并不愚蠢,所以我想,如果我的用户的数据不小心刷新或关闭了页面,该如何保存?幸运的是,Flask在会话中内置了Cookie。因此,我继续将重要的内容存储在会话中,在componentDidMount中,我尝试获取一些重要的内容。但是刷新后,Flask会忘记会话,并且我的提取操作不会返回有用的数据。
我尝试查找了一段时间,并且看到了一些有趣的东西,例如要获取的凭据参数。如果我写{credentials: "include"}
,请按照docs进行操作:
即使对于跨域调用,也始终发送用户凭据(cookie,基本的http auth等)。
表面上,这应该可以解决我的问题,并在某种程度上解决了我的困惑,但是,当然,没有这样的运气:
对预检请求的响应未通过访问控制检查:响应中的“ Access-Control-Allow-Credentials”标头的值为“,当请求的凭据模式为” include”时必须为“ true” 。因此,不允许访问来源“ http://localhost:3000”。
请帮助我了解正在发生的事情以及如何解决此问题。
我会继续研究。
答案 0 :(得分:1)
简而言之:
support_credentials=True
会产生Access-Control-Allow-Credentials: true
标头。{credentials: "include"}
Access-Control-Allow-Origin
,即http://foo.example
而不是*
。最好使用浏览器的开发工具进行故障排除。
答案 1 :(得分:0)
所以我找到了一个解决方案,但我愿意接受一个明确说明正在发生什么情况的答案。
我的解决方案是在我的Flask应用中添加protected void TransactionTypeTextBox_SelectedIndexChanged(object sender, DropDownListEventArgs e)
{
RadDropDownList dropdownlist1 = (RadDropDownList)sender;
GridEditFormInsertItem item = (GridEditFormInsertItem)dropdownlist1.NamingContainer;
Panel Panel1 = (Panel)item.FindControl("Panel1");
if (dropdownlist1.SelectedItem.Text == "Cheque")
{
Panel1.Visible = true;
}
else if (dropdownlist1.SelectedItem.Text == "Cash")
{
Panel1.Visible = false;
}
}
,使代码行如下所示:
supports_credentials=True
然后我可以在获取请求中添加CORS(app, supports_credentials=True)
,并且cookie似乎已成功存储。