关于Flask-Login中session失效时间的处理

ⅰ亾dé卋堺 提交于 2021-01-13 08:47:51

最近需要使用Python开发web系统,主要用到的框架就是Flask,前端使用Jinja2模板引擎和Bootstrap,web容器使用Cherrypy,其中关于Login管理的使用了Flask-Login插件。

基本上也是从零学起,前前后后花了有好几个月的时间,还是在借鉴了已有的一些项目基础上。在开发的过程中有很多的想法和体会,记录下来,有不对的地方欢迎大家指正。

在处理登录管理的部分,在 Flask-Login 中,如果你不特殊处理的话,session 是在你关闭浏览器之后失效的,而如果不关闭浏览器的话,失效的时间据说是1年,还是1个月,这个地方没看到官方说法,总之是很长,在某些业务场景下这样的处理方式是不能接受的。由于系统的使用者提出了新的需求类似平时的SSO处理机制,大概无任何操作一二十分钟就提示需要再次登录,这样的要求是合理的,之前也没有太注意这个方面的时间,所以就需要回过头来研究Flask-Login的session失效时间和设置问题。以前的登录部分代码:

 1 @app.route('/login', methods=['GET', 'POST'])
 2 def login():
 3     if request.method == 'GET':
 4         return render_template('login.html')
 5 
 6     username = request.form['username']
 7     password = request.form['password']
 8     user = User.get_user(username, password)
 9     if not user:
10         flash('Username or Password is invalid.', 'error')
11         return redirect(url_for('.login'))
12     login_user(user)
13 
14     # flash('Logged in successfully', "info")
15 
16     return render_template('index.html')

其中的User是models.py中定义的class,可以用于验证用户的合法性。在views部分通过@login_required控制,这样可以成功验证用户并跳转到相应页面,但是之前提到的session失效问题默认是很长时间而且一旦关闭浏览器即失效。那么如何设置能够实现制定时间内session失效,比如10minutes,查了一下文档竟然没发现说到这个问题,比如这个网站:http://www.pythondoc.com/flask-login/应该是正规的文档吧,接着查一些论坛,很多人讨论这个问题,有说设置REMEMBER_COOKIE_DURATION这个参数的,但是仔细看了这个参数和要解决的问题不是一个问题,接着就想到去stackoverflow上查一下吧,就搜索了一下关键词,找了好几个问答,其中有说到参数permanent_session_lifetime,

我觉得应该是这个差不多了,接着就这个关键词再次搜索,果然发现了一些很有参考价值问答,其中还提到session.permanent = True这个参数,于是在代码里进行设置:
from flask import session
from datetime import timedelta

session.permanent = True
app.permanent_session_lifetime = timedelta(minutes=10)

其中两个参数意义也比较好理解,第一个为设置session为永久的,第二个再来制定具体时间

但是,关键是但是测试了半天貌似不起作用,又查了半天中文的一些论坛,不知原因何在,然后又是在stackoverflow上有人说这个设置不能放在request外面,要放在request里面才能生效,比如这样:

 1 from flask import session
 2 from datetime import timedelta
 3 
 4 @app.route('/login', methods=['GET', 'POST'])
 5 def login():
 6     if request.method == 'GET':
 7         return render_template('login.html')
 8 
 9     username = request.form['username']
10     password = request.form['password']
11     user = User.get_user(username, password)
12     if not user:
13         flash('Username or Password is invalid.', 'error')
14         return redirect(url_for('.login'))
15     login_user(user)
16     session.permanent = True
17     app.permanent_session_lifetime = timedelta(minutes=10)
18     # flash('Logged in successfully', "info")
19 
20     return render_template('index.html')

再去测试,已经可以成功按设置的时间来提示登录了。

这个问题也许对于一些人来不算问题,但是从我自己解决这个问题来看,目前我们的一些文档,问答还是有很多欠缺的地方,论坛上往往对一个问题互相转载,很少有独立的思考和实践的代码sample让初学者参考,在此再次推荐推荐大家一个问答网站:stackoverflow,相信很多人也都在用这个,能够得到很多有价值的问答,尤其是在国内还不是用的特别广泛的技术。

对于这个问题,目前也是能使用的阶段,也没有再去研究Flask-Login的一些原理,对于技术只有实践了你才有可能真正掌握,或者只能停留在理论阶段,希望以后有机会再深入研究实践一下。

 
 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!