Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python flask:通过AJAX获取剩余会话时间_Python_Ajax_Session_Flask - Fatal编程技术网

Python flask:通过AJAX获取剩余会话时间

Python flask:通过AJAX获取剩余会话时间,python,ajax,session,flask,Python,Ajax,Session,Flask,我使用的是Flask,Flask会话插件用于存储在Redis后端的服务器端会话。我已设置为使用会话超时的持久会话。如何在不重置超时的情况下发出AJAX请求以获取会话剩余时间 这样做的目的是,如果用户在同一浏览器的不同选项卡/窗口中处于活动状态,则客户端在显示超时警告(或注销用户)之前与服务器进行检查 编辑:经过一些挖掘,我找到了config指令SESSION\u REFRESH\u EACH\u REQUEST,似乎我可以使用它来完成我想要的:将其设置为False,然后只有在会话中发生实际更改时

我使用的是Flask,Flask会话插件用于存储在Redis后端的服务器端会话。我已设置为使用会话超时的持久会话。如何在不重置超时的情况下发出AJAX请求以获取会话剩余时间

这样做的目的是,如果用户在同一浏览器的不同选项卡/窗口中处于活动状态,则客户端在显示超时警告(或注销用户)之前与服务器进行检查

编辑:经过一些挖掘,我找到了config指令
SESSION\u REFRESH\u EACH\u REQUEST
,似乎我可以使用它来完成我想要的:将其设置为False,然后只有在会话中发生实际更改时才应该刷新会话,因此,我应该能够在会话超时没有改变的情况下请求获取超时。它是在0.11中添加的,我正在运行0.11.1,所以它应该是可用的


不幸的是,在实践中,这似乎不起作用-至少在检查redis键的
ttl
以获得剩余时间时是如此。我检查了,并且
session.modified
为False,因此不仅仅是我在请求中做了一些修改会话的事情(除非它只是没有设置该标志)

以下工作正常,尽管它相当粗糙:

在应用程序
\uuuu init\uuuuu.py
中,或在调用
会话(应用程序)
初始化应用程序(应用程序)
的任何位置:

然后,在
check_timeout
函数(在上面的旁路列表中)中,我们可以执行以下操作来获取会话的剩余时间:

@app.route('/auth/check_timeout')
def check_timeout():
    """"""
    session_id = flask.session.sid

    # Or however you want to get a redis instance
    redis = app.config.get('REDIS_MASTER')

    # If used
    session_prefix = app.config.get('SESSION_KEY_PREFIX')

    #combine prefix and session id to get the session key stored in redis
    redis_key = "{}{}".format(session_prefix, session_id)

    # The redis ttl is the time remaining before the session expires
    time_remain = redis.ttl(redis_key)

    return str(time_remain)

我相信上面的内容可以改进,但是结果是理想的:当调用
/auth/check\u timeout
时,将返回会话上剩余的时间,而不以任何方式修改会话。

以下方法可以工作,尽管它相当粗糙:

在应用程序
\uuuu init\uuuuu.py
中,或在调用
会话(应用程序)
初始化应用程序(应用程序)
的任何位置:

然后,在
check_timeout
函数(在上面的旁路列表中)中,我们可以执行以下操作来获取会话的剩余时间:

@app.route('/auth/check_timeout')
def check_timeout():
    """"""
    session_id = flask.session.sid

    # Or however you want to get a redis instance
    redis = app.config.get('REDIS_MASTER')

    # If used
    session_prefix = app.config.get('SESSION_KEY_PREFIX')

    #combine prefix and session id to get the session key stored in redis
    redis_key = "{}{}".format(session_prefix, session_id)

    # The redis ttl is the time remaining before the session expires
    time_remain = redis.ttl(redis_key)

    return str(time_remain)
我相信上面的内容可以改进,但是结果是理想的:当调用
/auth/check\u timeout
时,将返回会话上剩余的时间,而不会以任何方式修改会话