Flask регистрирует повторяющиеся запросы XHR CORS от Safari - PullRequest
4 голосов
/ 03 июля 2019

Во-первых, я не уверен, что это проблема с Flask, Safari или Flask-CORS.

Чтобы эмулировать производственные настройки, у меня есть локальный бэкэнд (API) Flask на одномдомен и интерфейс (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, который увеличивает счетчик в базе данных для конкретных запросов, и счетчик всегда увеличивается на 2, а не на 1, если я использую Safari.

Я нашел некоторую информацию в другом потоке SO , который, по-видимому, предполагает, что Safari выполняет условный запрос.Предложение в потоке должно установить заголовок If-Unmodified-Since при выполнении запроса XHR во внешнем интерфейсе.Я попробовал это, и это, кажется, решило проблему - первый запрос GET, кажется, заменен запросом OPTIONS, сопровождаемым GET.Если вы обновите пару раз, выполняется только GET.После короткого периода обновления выполняется другой запрос OPTIONS.Однако, если вы не предоставите If-Unmodified-Since и не зарегистрируете заголовки запросов в обработчике Flask, заголовки обоих запросов выглядят одинаково.

Кроме того, использование первого заголовка вместо If-Modified-Since также кажется первымзапустить запрос OPTIONS, за которым следует GET, но это не мешает двойному GET - запускается другой GET!

Я установил Github repo , содержащий минимальный пример, который воспроизводитэто поведение.Это требует немного настройки, но инструкции изложены в README.Также есть прикрепленная запись экрана.

Я мог бы согласиться просто добавить If-Unmodified-Since и назвать это днем, но это похоже на чистку всей проблемы под ковром. Зачем это нужно дляSafari, но не другие браузеры?

...