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

2024-06-16 11:18:41 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我不确定这是不是一个烧瓶或狩猎或烧瓶CORS问题。你知道吗

为了模拟生产设置,我在一个域上有一个本地Flask后端(API),在另一个域上有一个前端(SPA)。我最初尝试了这个方法,API和前端都通过HTTPS运行,使用相同的自签名证书,由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。你知道吗

我在另一个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,其中包含一个复制这种行为的最小示例。它需要一些设置,但说明在自述文件中概述。还有一个屏幕录音附件。你知道吗

我可以满足于仅仅添加If-Unmodified-Since并结束这一天,但这感觉有点像是把整个问题掩盖起来。。为什么Safari需要它,而不是其他浏览器?你知道吗


Tags: apiflaskgetif烧瓶记录计数器pem