如何防止更新特定URL的会话到期时间

时间:2018-01-02 18:18:52

标签: python session flask

Flask版本:

>>> flask.__version__
'0.12.2'

我不想更新某个网址的到期时间 目前,我使用以下方法设置会话到期时间:

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 个答案:

答案 0 :(得分:3)

如果会话被标记为已修改或已设置SESSION_REFRESH_EACH_REQUEST选项,则会设置Cookie。默认情况下,该选项为True。

在Flask配置中尝试设置

SESSION_REFRESH_EACH_REQUEST = False

来自文档:

  

SESSION_REFRESH_EACH_REQUEST

     

控制是否发送cookie   session.permanent为true时的每个响应。发送cookie   每次(默认)都可以更可靠地保持会话   到期,但使用更多带宽。非常任会议不是   影响。

     

默认值:True

答案 1 :(得分:1)

修改

另一个选择是使用Blueprints将您的终端分成不同的自治应用程序:

  1. 分开您的"民意调查"蓝图中的(retrieve_status())方法。
  2. 将蓝图注册到APPAPP.register_blueprint(your_blue_print)
  3. 现在,您的retrieve_status()方法与APP方法是分开的,@before_request在您调用时无法触发。

    进一步阅读蓝图:

    我认为你有两个选择:

    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. 的会话设置部分
    3. 修改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