Версия 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"
2 ответа
Файлы cookie устанавливаются, если сеанс отмечен как измененный, ИЛИ если установлен параметр SESSION_REFRESH_EACH_REQUEST
. По умолчанию опция True.
В вашей конфигурации Flask попробуйте установить
SESSION_REFRESH_EACH_REQUEST = False
Из документации:
SESSION_REFRESH_EACH_REQUEST
Контролируйте, будет ли cookie отправляться с каждым ответом, если session.permanent имеет значение true. Отправка файла cookie каждый раз (по умолчанию) может более надежно предотвратить истечение срока сеанса, но требует большей пропускной способности. Непостоянные сеансы не затрагиваются.
По умолчанию: True
РЕДАКТИРОВАТЬ:
Еще один вариант - использовать Blueprints
для разделения ваших конечных точек на разные и автономные приложения:
- Разделите свой метод "опроса" (
retrieve_status()
) в схеме. - Зарегистрируйте чертеж на своем
APP
:APP.register_blueprint(your_blue_print)
Теперь ваш метод retrieve_status()
отделен от методов APP
, и @before_request
не запускается, когда вы его вызываете.
Дополнительная литература по чертежам:
- http://flask.pocoo.org/docs/0.12/blueprints/ ( официальная документация)
- https://danidee10.github.io/2016/ 20 ноября / flask-by-example-8.html (как в учебнике)
- http://nullege.com/codes/search/flask.Blueprint.before_request (Вы даже можете создать
before_request
для своего чертежа)
Насколько я понимаю, у вас есть 2 варианта:
Используйте
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()
Измените метод
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
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.