Python Flask记录来自Safari的重复XHR CORS请求

Python Flask记录来自Safari的重复XHR CORS请求,python,flask,safari,cors,flask-cors,Python,Flask,Safari,Cors,Flask Cors,首先,我不确定这是一个烧瓶,还是一次狩猎或烧瓶CORS问题 为了模拟生产设置,我在一个域上有一个本地Flask后端(API),在另一个域上有一个前端(SPA)。最初,我尝试在HTTPS上运行API和前端,使用相同的自签名证书,由openssl req-x509-newkey rsa:4096-nodes-keyout key.pem-out cert.pem-days 365生成。但事实证明,在普通HTTP上运行时,下面描述的行为也会表现出来 据我所知,Chrome和Firefox工作正常,但当

首先,我不确定这是一个烧瓶,还是一次狩猎或烧瓶CORS问题

为了模拟生产设置,我在一个域上有一个本地Flask后端(API),在另一个域上有一个前端(SPA)。最初,我尝试在HTTPS上运行API和前端,使用相同的自签名证书,由
openssl req-x509-newkey rsa:4096-nodes-keyout key.pem-out cert.pem-days 365
生成。但事实证明,在普通HTTP上运行时,下面描述的行为也会表现出来

据我所知,Chrome和Firefox工作正常,但当我用Safari打开前端并正常导航时,Flask似乎会记录每个XHR请求两次。我只是发现了这一点,因为我有一个Flask decorator,它为特定请求在数据库中增加一个计数器,如果我使用Safari,计数器总是增加2而不是1

我在另一个数据库中发现了一些信息,这似乎表明Safari正在执行一个有条件的请求。线程中的建议是,在前端发出XHR请求时,如果未修改,则设置
,因为
头。我试过了,这似乎解决了问题——第一个GET请求似乎被一个选项请求取代,然后是一个GET。如果刷新几次,则只执行GET。在短暂的刷新时间后,它将执行另一个选项请求。但是,如果您不提供
(如果自
以来未修改)并将请求头记录在Flask处理程序中,则两个请求的头看起来是相同的

另外,如果修改,则使用不同的头而不是
,因为
似乎也会首先触发选项请求,然后触发GET,但这并不能阻止双GET-触发另一个GET

我已经建立了一个包含一个复制这种行为的最小示例的模型。它需要一些设置,但说明在自述文件中概述。还有一个屏幕记录附加


我可以满足于只添加
(如果没有修改的话)
,然后结束这一天,但这感觉有点像是把整个问题掩盖起来。。为什么需要Safari,而不是其他浏览器?

请考虑在SkyRay/WebKIT Bug报告中提交一个关于SkyRay/WebKIT的bug报告。我想我会尝试使用另一个后端,比如Ruby+Sinatra或Node,尝试隔离这是否真的是Safari问题。考虑到相关技术的相对普及度,这真的让我感觉很早以前就被发现了,这让我觉得我在做一些愚蠢的事情。这可能是一个新问题,甚至是一个旧问题的回归——例如和。请看,这是一个老错误,但有趣的是它被关闭了,因为原因无论如何无法在WebKit代码中修复,而是由于WebKit所依赖的平台网络代码中的行为。