为什么Flask Security会为每个请求创建新的KVSession记录?

为什么Flask Security会为每个请求创建新的KVSession记录?,flask,flask-sqlalchemy,flask-security,flask-kvsession,Flask,Flask Sqlalchemy,Flask Security,Flask Kvsession,我正在尝试使用作为Flask网站的替代会话实现。我已经创建了一个测试网站(请参见下面的代码1)。运行此操作时,我可以使用浏览器在web浏览器中的各种资源之间导航,从而将值存储到会话中。这是正确的。另外,当我查看生成的SQLite数据库中的sessions表时,我看到一条记录,它一直用于存储此会话 然后,我尝试添加到这一点(请参见下面的代码2)。运行此站点后(确保首先删除现有的test.db sqlite文件),我将进入登录提示并登录。然后我继续做同样的事情,在资源之间来回跳跃。我得到了同样的结果

我正在尝试使用作为Flask网站的替代会话实现。我已经创建了一个测试网站(请参见下面的代码1)。运行此操作时,我可以使用浏览器在web浏览器中的各种资源之间导航,从而将值存储到会话中。这是正确的。另外,当我查看生成的SQLite数据库中的
sessions
表时,我看到一条记录,它一直用于存储此会话

然后,我尝试添加到这一点(请参见下面的代码2)。运行此站点后(确保首先删除现有的test.db sqlite文件),我将进入登录提示并登录。然后我继续做同样的事情,在资源之间来回跳跃。我得到了同样的结果

问题是,当我查看sqlitebrowser
sessions
表时,有8条记录。结果是,为每个请求创建了一个新的会话记录

为什么在使用Flask Security时为每个请求创建一个新的会话记录?为什么现有会话没有像以前一样更新

代码1(无Flask安全的KVSession)

代码2(KVSession与Flask Security)

版本信息

Python 2.7.3
Flask==0.9
Flask==0.9
Flask-KVSession==0.3.2
Flask-Login==0.1.3
Flask-Mail==0.8.2
Flask-Principal==0.3.5
Flask-SQLAlchemy==0.16
Flask-Security==1.6.3
SQLAlchemy==0.8.1

当flask登录与KVSession这样的会话存储库一起使用时,这与with(flask安全性使用的)有关

基本上,每当创建或修改会话中的数据时,KVSession都需要使用新的会话信息更新数据库。在上面的示例中,这是正确的:当我第一次点击页面时,会话被创建。之后,将更新现有会话

但是,在后台,浏览器会向我的web服务器发送一个无cookie请求,以查找我的favicon。因此,flask正在处理对
/favicon.ico
的请求。此请求(或任何其他404请求)仍由flask处理。这意味着flask登录将查看请求并尝试执行其神奇的操作

碰巧flask login没有尝试将任何内容放入会话中,但就KVSession而言,会话似乎已经被修改。由于会话看起来已被修改,KVSession将更新数据库。以下是flask登录的代码:

def _update_remember_cookie(self, response):
    operation = session.pop("remember", None)
    ...
在请求生命周期中调用
\u update\u memory\u cookie
方法。虽然session.pop不会在会话没有“记住”键(在本例中没有)的情况下更改会话,但KVSession仍会看到一个pop并假定会话已更改

flask登录的问题提供了简单的bug修复,但它还没有被推到flask登录中。看来维护人员正在寻找一个完整的重写,并将在那里实现它

Python 2.7.3
Flask==0.9
Flask==0.9
Flask-KVSession==0.3.2
Flask-Login==0.1.3
Flask-Mail==0.8.2
Flask-Principal==0.3.5
Flask-SQLAlchemy==0.16
Flask-Security==1.6.3
SQLAlchemy==0.8.1
def _update_remember_cookie(self, response):
    operation = session.pop("remember", None)
    ...