Flask Сессия не содержит значения между запросами - PullRequest
0 голосов
/ 20 марта 2020

Я веб-разработчик ладьи ie и пытаюсь реализовать приложение Flask + React. В React у меня есть форма, которая запрашивает user_id и пароль. После того, как пользователь вводит необходимые данные, React (Ax ios) отправляет их в мой бэкэнд с функцией updateDoneStatus, как показано (она вызывает getName для извлечения полученных данных):

 getName = () => {
     axios.get('http://127.0.0.1:5000/data')
      .then(res => {
            const name = res.data['name'];
            this.setState({name: name})
      }).catch(e => {
        console.log(e);
    });

 updateDoneStatus = () => { 
     this.setState({done: true})

     axios.post("http://127.0.0.1:5000/login",{
          data: {
              id: this.state.id,
              pw: this.state.pw
          }
      }).catch(e => {
         console.log(e);
      }).then(this.getName)};

Когда пользователь заполняет форму, моему бэкэнду удается получить отправленные данные и начать просмотр веб-страниц, как показано ниже:

from flask import *
from flask_session.__init__ import Session
import requests
from bs4 import BeautifulSoup
from flask_cors import CORS
import re

app = Flask(__name__)
CORS(app)
app.config['SECRET_KEY'] = 'super secret key'
userID = ""
userPW = ""

@app.route("/login", methods=['POST'])
def getData():
    nameArr = []
    if request.get_json() != None:
        data = request.get_json()
        userID = str(data["data"]["id"])
        userPW = str(data["data"]["pw"])

        login_data = {
        'userid' :  userID,
        'pwd' : userPW,
        'Submit' : 'Sign In'
        }

        with requests.Session() as s:
            url = 'SOME URL'
            r = s.post(url,data = login_data)
            newUrl = 'SOME OTHER URL'
            a = s.get(newUrl)
            src = a.content
            soup = BeautifulSoup(src,features="html.parser")
            text = soup.get_text()
            nameArr = re.findall("some regex",re.findall("some regex",text)[0])

            session.permanent = True
            session["name"] = nameArr[0]
            session.modified = True

            return {'name' : session["name"]}
    else:    
        return {'name' : "it's not saved to session"}



@app.route("/data", methods=['POST', 'GET'])
def sendData():
    if "name" in session:
        return {'name': session["name"]}
    else 
        return {"name was not in session :("}

Из моих тестов я вижу, что он успешно входит на нужный URL и может получить очищенные данные, поэтому нет проблем с отправкой данных на сервер или веб-очисткой этих данных.

Насколько я понял из документов сессий в Flask, моя реализация должна хранить данные в session["name"] и сохраняйте его, пока пользователь не закроет браузер. Но всякий раз, когда я хочу отправить данные на мой интерфейс с помощью sendData(), он всегда печатает «имя не было в сеансе :(», что означает, что он не смог найти ключ «имя» в сеансе.

Некоторые догадки, почему это происходит:

  • Сеанс сбрасывается после каждого запроса.
  • Может быть, он создает новый сеанс каждый раз, когда я делаю запрос.
  • Может быть библиотека «запросы» и Flask «запрос» пересекаются.

Мне кажется, я не совсем понял, как работают сессии, и я не смог найти достаточно информации в Интернете.

Я знаю, что что-то упустил, кто-то может помочь?

Кроме того, я прочитал, что сеанс хранит данные на сервере, есть ли способ сохранить данные в браузере клиентов (например, куки), если так Как вы реализуете такую ​​вещь? Если бы вы могли объяснить это, внедрив ее в свой собственный код, это было бы здорово!

(если вам нужна какая-либо другая информация, пожалуйста, дайте мне знать)

Спасибо

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Вы отправляете запросы из разных источников, которые по умолчанию не разрешают использование файлов cookie. Попробуйте инициализировать Flask -CORS следующим образом:

CORS(app, supports_credentials=True)

Дополнительная информация: https://flask-cors.readthedocs.io/en/latest/api.html#using -cors-with-cookies .

0 голосов
/ 20 марта 2020

Из наших обсуждений в комментариях мы узнали, что сеансы не сохраняются между вызовами API, если и внешний, и внутренний интерфейсы размещены в разных портах.

Теперь отправка файлов cookie из Flask в интерфейс React также невозможна по той же причине. Он работает только для Flask веб-интерфейсов.

Вы можете сделать одну вещь, которую вы когда-либо захотите установить как куки, вы можете отправить ее в ответ от Flask, а из React вы можете установить эти куки , Вы должны будете отправить это значение на Flask для каждого запроса. Я не знаком с React, но в моем приложении Angular (как и в базовом c) я сделал, как показано ниже:

document.cookie = 'token='+result.token

В angular вы можете легко это сделать с помощью третьего Также вам может помочь следующее: https://itnext.io/angular-8-how-to-use-cookies-14ab3f2e93fc

И в React эта ссылка поможет вам: { ссылка }

...