#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
Теперь он работает стабильно, я могу изменить переменную сеанса на любую, какую захочу, и она всегда использует обновленное значение.
Кто-нибудь может объяснить, что здесь произошло?