Объект Flask Session () не является постоянным - PullRequest
0 голосов
/ 21 сентября 2018

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

@bp.route('/login', methods=('POST',))
def login():
    ...

    error=None
    res = {}

    db = get_db()
    cursor = db.cursor(dictionary=True)
    ...
    user = cursor.fetchone()

    ...

    if error is None:
        session.clear()
        session.permanent = True
        session['userID'] = user['id']
        current_app.logger.debug(session['userID'])

        res['actionSuccess']= True
    else:
        res['actionSuccess'] = False
        res['error'] = error

    return jsonify(res)

Пока я могу сказать, что сессии действительно хранят значение userID.Затем я пишу другой маршрут, чтобы сообщить мне, хранится ли значение userID в сеансе, например:

@bp.route('/init', methods=('GET',))
def init():
    userID = session.get('userID') 
    if userID is None:
        res = {"signedIn": False}
    else:
        res = {"signedIn": True, "username": userID}
    return jsonify(res)

Однако каждый раз, когда я выполняю вызов '/ init', он возвращает False, даже если я ранее подписалв. Я не знаю, почему сессия здесь не является постоянной.Это потому, что я запускаю клиент локально на моей машине?Нужно ли разрешать файлы cookie где-то в моем браузере Chrome?Я использовал Chrome для просмотра файлов cookie, хранящихся для клиента, и там не было никаких сессий.Нужно ли мне что-то дополнительное на внешнем интерфейсе для хранения файлов cookie / сессии или они сохраняются автоматически?Я неправильно понимаю использование сессий Flask?

1 Ответ

0 голосов
/ 21 сентября 2018

Узнал, почему сессии не работали после большого количества исследований!Сеансы Flask - это, по сути, файлы cookie, и я использовал Fetch API для выполнения операций CORS.Fetch () по умолчанию не позволяет принимать или отправлять файлы cookie, и их необходимо настроить для использования сеансов Flask.

В моем клиенте React.js я сделал это, установив «include» для «учетных данных»':

        fetch(url, {
            method: 'POST',
            mode: 'cors',
            body: JSON.stringify(loginObj),
            credentials: 'include',
            headers: {
                'Content-Type': 'application/json'
            }
        })
        .then(res => res.json())
        ...

Из-за этой конфигурации запрос не считается «простым запросом», и клиент фактически «предварительно отправляет» запрос POST запросом OPTIONS.Это означает, что перед отправкой моего запроса POST тестирование OPTIONS для проверки наличия у сервера правильного доступа будет сначала отправлено на мой Flask-сервер.

Предварительный запрос OPTIONS будет проверять, получен ли ответ отсервер имеет правильные заголовки, содержащие «Access-Control-Allow-Origin», «Access-Control-Allow-Credentials» и «Access-Control-Allow-Headers».Если тест, отправленный запросом OPTIONS, не пройден, фактический запрос POST не будет отправлен, и вы получите ошибку Fetch.

Затем я соответствующим образом устанавливаю заголовки на моем сервере Flask следующим образом:

@bp.route('/login', methods=('POST','OPTIONS'))
def login():
    if request.method == 'OPTIONS':
        resp = Response()
        resp.headers['Access-Control-Allow-Origin'] = clientUrl
        resp.headers['Access-Control-Allow-Credentials'] = 'true'
        resp.headers['Access-Control-Allow-Headers'] = "Content-Type"

        return resp
    else:

        '''
        use session for something  
        '''  

        res['actionSuccess'] = False
        js = json.dumps(res)

        resp = Response(js, status=200, mimetype='application/json')        
        resp.headers['Access-Control-Allow-Origin'] = clientUrl
        resp.headers['Access-Control-Allow-Credentials'] = 'true'
        resp.headers['Access-Control-Allow-Headers'] = "Content-Type"

        return resp

Обратите внимание, что для Access-Control-Allow-Credentials было установлено значение true, в отличие от логического значения Python True, поскольку клиент не будет распознавать логическое значение Python.

И с этим, объект сеанса Flask должен храниться в ваших файлах cookie.

...