Переменные сеанса Flask не сохраняются при использовании выборки

#session #flask #fetch

#сессия #фляжка #выборка

Вопрос:

У меня есть настройка двух маршрутов flask (определенных с помощью Flask Rest-X) следующим образом.

 class Send(Resource):

    def get(self: Any) -> Any:
        session['foo'] = 'bar'
        return {'message': session['foo']}


class Receive(Resource):

    def get(self: Any) -> Any:
        return {'message': session.get('foo', 'empty')}
 

Оба зарегистрированы как конечные точки в /send и / receive соответственно. Здесь нет ничего умного, просто две конечные точки flask, которые поддерживают запросы GET.

Когда я захожу в браузер и захожу на localhost: 5000 /отправить. Я получаю обратно {‘message’: ‘bar’}, как и должен. Когда я затем перехожу на localhost: 5000 / receive, я получаю то же самое. Это означает, что сеанс работает так, как должен.

Теперь у меня есть следующий фрагмент javascript, который пытается сделать то же самое, используя выборку.

 fetch(`http://localhost:5000/send`, {
          method: 'GET',
          mode: 'cors',
          credentials: 'same-origin'
        })
          .then(response => response.json())
          .then(data => {
            fetch(`http://localhost:5000/receive`, {
              method: 'GET',
              mode: 'cors',
              credentials: 'same-origin'
            })
              .then(response => response.json())
              .then(data => {setResponse(data)})
          })
 

Строка setResponse(data) похожа на вывод на консоль, она просто записывает вывод на экран, в любом случае я получаю обратно {‘message’: ’empty’}, поэтому использование выборки не позволяет правильно настроить переменные сеанса.

Мне кажется, что это комбинация учетных данных и CORS, но, похоже, я не могу правильно подобрать комбинацию.

Я уже пробовал:

учетные данные: включить -> Приводит к ошибке CORS.

учетные данные: тот же источник -> Пусто

учетные данные: того же происхождения и режима: cors -> Пусто

Затем я попробовал кое-что новое. Я добавил заголовок к маршруту /receive следующим образом.

 class Receive(Resource):

    def get(self: Any) -> Any:
        response = make_response({'message': session.get('me', 'empty')})
        response.headers['Access-Control-Allow-Credentials'] = 'true'
        return response
 

Затем я попробовал учетные данные: включить снова .. и успех!! Я получил {‘message’: ‘bar’}. Так что это явно сработало.. но тогда вот что самое загадочное. Я изменил ‘foo’ и ‘bar’ на ‘one’ и ‘two’ соответственно и попробовал еще раз, и теперь я вернулся к {‘message’: ’empty’} . Итак, почему это внезапно сработало для foo / bar, когда я добавил заголовок ответа, и почему этот заголовок ответа больше не работает? Это проблема с кэшированием? Комбинаторика этой проблемы немного сводит меня с ума.

У кого-нибудь есть какие-либо советы о том, как заставить выборку работать с сеансами Flask?

Ответ №1:

Я думаю, я решил это. Но я не знаю почему, поэтому я все равно был бы признателен, если кто-нибудь сможет меня просветить, я ненавижу решения, которые «просто работают».

Я изменил внутренний код на следующий (добавил заголовок Access-Control-Allow-Credentials как для отправки, так и для получения.

 class Send(Resource):

    def get(self: Any) -> Any:
        session['success'] = 'yes'
        response = make_response({'message': session.get('success', 'empty')})
        response.headers['Access-Control-Allow-Credentials'] = 'true'
        return response


class Receive(Resource):

    def get(self: Any) -> Any:
        response = make_response({'message': session.get('success', 'empty')})
        response.headers['Access-Control-Allow-Credentials'] = 'true'
        return response
 

Теперь он работает стабильно, я могу изменить переменную сеанса на любую, какую захочу, и она всегда использует обновленное значение.

Кто-нибудь может объяснить, что здесь произошло?