Версия Flask:

>>> flask.__version__
'0.12.2'

Я не хочу обновлять срок действия определенного URL.
В настоящее время я использую следующий метод установки времени окончания сеанса:

session.permanent = true
app.permanent_session_lifetime = timedelta(minutes=int(10))

У меня есть страница состояния, которая автоматически обновляется каждую минуту с помощью метода ajax для получения только данных.
В этом случае я не хочу сбрасывать время окончания сеанса.
Есть ли способ сделать это?

Изменить:

Мой код на данный момент:

from datetime import timedelta
from flask import Flask
from flask import session

APP = Flask(__name__, static_url_path='', static_folder='templates')

def create_user_session(user_accountid, auth_token):
    session['token'] = auth_token
    session['user_accountid'] = user_accountid

def update_session():
    session.permanent = True
    APP.permanent_session_lifetime = timedelta(minutes=10)
    session.modified = True

@APP.route('/batch_status', methods=['GET'])
def view_status():
    create_user_session(1, "****")
    update_session()
    return "Session Change"

@APP.route('/batch_status_json', methods=['GET'])
def retrieve_status():
    return "Session No Change"

if __name__ == '__main__':
    APP.secret_key = "My Precious Key"
    APP.run(host='0.0.0.0', debug=True, port=8000)

Я не хочу изменять время окончания сеанса при вызове batch_status_json, но оно автоматически изменяется при вызове.

Edit2:

monitor_controller.py:

from datetime import timedelta
from flask import Flask
from flask import session
from status import RETRIEVE_STATUS

APP = Flask(__name__, static_url_path='', static_folder='templates')

APP.register_blueprint(RETRIEVE_STATUS)
def create_user_session(user_accountid, auth_token):
    session['token'] = auth_token
    session['user_accountid'] = user_accountid

def update_session():
    session.permanent = True
    APP.permanent_session_lifetime = timedelta(minutes=10)
    session.modified = True

@APP.route('/batch_status', methods=['GET'])
def view_status():
    create_user_session(1, "****")
    update_session()
    return "Session Change"

if __name__ == '__main__':
    APP.secret_key = "My Precious Key"
    APP.run(host='0.0.0.0', debug=True, port=8000)

status.py:

from flask import Blueprint

RETRIEVE_STATUS = Blueprint('retrieve_status', __name__)
@RETRIEVE_STATUS.route('/batch_status_json', methods=['GET'])
def retrieve_status():
    return "Session No Change"
4
The6thSense 2 Янв 2018 в 21:18

2 ответа

Лучший ответ

Файлы cookie устанавливаются, если сеанс отмечен как измененный, ИЛИ если установлен параметр SESSION_REFRESH_EACH_REQUEST. По умолчанию опция True.

В вашей конфигурации Flask попробуйте установить

SESSION_REFRESH_EACH_REQUEST = False

Из документации:

SESSION_REFRESH_EACH_REQUEST

Контролируйте, будет ли cookie отправляться с каждым ответом, если session.permanent имеет значение true. Отправка файла cookie каждый раз (по умолчанию) может более надежно предотвратить истечение срока сеанса, но требует большей пропускной способности. Непостоянные сеансы не затрагиваются.

По умолчанию: True

3
user650881 8 Янв 2018 в 21:26

РЕДАКТИРОВАТЬ:

Еще один вариант - использовать Blueprints для разделения ваших конечных точек на разные и автономные приложения:

  1. Разделите свой метод "опроса" (retrieve_status()) в схеме.
  2. Зарегистрируйте чертеж на своем APP: APP.register_blueprint(your_blue_print)

Теперь ваш метод retrieve_status() отделен от методов APP, и @before_request не запускается, когда вы его вызываете.

Дополнительная литература по чертежам:


Насколько я понимаю, у вас есть 2 варианта:

  1. Используйте session.modified=True явно только внутри представлений, если вы хотите:

    from flask import session
    
    def update_session():
        session.permanent = True
        app.permanent_session_lifetime = timedelta(minutes=10)
        session.modified = True
    
    @app.route('/batch_status', methods=['GET'])
    def view_status():
        ...
        Do stuff
        ...    
        update_session()
        return "Session Change"
    

    и удалите часть настройки сеанса вашего метода before_request()

  2. Измените метод before_request(), чтобы исключить конечную точку retrieve_status:

    @APP.before_request
    def before_request():
        ...
        Do stuff
        ...
        if (request.endpoint != 'retrieve_status'):
            session.permanent = True
            app.permanent_session_lifetime = timedelta(minutes=10)
            session.modified = True 
    
1
John Moutafis 5 Янв 2018 в 10:55