首先,我不确定这是Flask,Safari还是Flask-CORS问题。
为了模拟生产设置,我在一个域上有一个本地Flask后端(API),在另一个域上有一个前端(SPA)。最初,我使用了由openssl req -x509 -newkey rsa:4096 -nodes -keyout key.pem -out cert.pem -days 365
生成的相同的自签名证书,对API和运行在HTTPS上的前端进行了尝试。但是事实证明,当在纯HTTP上运行时,以下描述的行为也很明显。
据我所知,Chrome和Firefox可以正常工作,但是当我使用Safari打开前端并正常浏览时,Flask似乎将每个XHR请求记录两次。我只是发现了这一点,因为我有一个Flask装饰器,可以针对特定请求在数据库中增加一个计数器,并且如果使用Safari,则计数器总是以2而不是1递增。
我在另一个SO thread中发现了一些信息,这似乎表明Safari正在执行条件请求。线程中的建议是在前端发出XHR请求时设置If-Unmodified-Since
头。我尝试过,这似乎可以解决问题-第一个GET请求似乎被OPTIONS请求替换,随后是GET。如果刷新几次,则仅执行GET。短暂的刷新后,它将执行另一个OPTIONS请求。但是,如果您不提供If-Unmodified-Since
并在Flask处理程序中记录请求标头,则两个请求的标头看起来都是相同的。
此外,似乎使用其他标头代替If-Modified-Since
也会首先触发一个OPTIONS请求,然后触发一个GET,但这并不能防止双重GET —会触发另一个GET!
我设置了一个Github repo,其中包含一个最小的示例来重现此行为。它需要一些设置,但是说明在README中有所概述。还有一个屏幕录像。
我可以满足于只添加If-Unmodified-Since
并每天调用它,但是感觉有点像把整个问题都笼罩在了地毯下。为什么Safari需要它,而其他浏览器却不需要?