Flask 配置 session 和 cookie 的过期时间 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
mzmxcvbn
V2EX    Python

Flask 配置 session 和 cookie 的过期时间

  •  
  •   mzmxcvbn 2018-05-02 09:30:03 +08:00 7551 次点击
    这是一个创建于 2735 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在要实现两个功能:
    1.用户关掉浏览器后,2 个小时之内再打开,可以不用再登录。
    2.用户登录后,停在页面 1 个小时不操作,则强制登出。

    我现在用的是 Flask-login,用了 login_user()的 remember me 功能,并在 config 里配置了 REMEMBER_COOKIE_DURATION = timedelta(hours=2)。我原以为这一步只能实现第一个功能。

    后来我又谷歌了半天,很多都说要配置 session 以实现第二个功能:
    在 login 的视图函数中:
    session.permanent = True
    app.permanent_session_lifetime = timedelta(hours=1)

    可是我发现 cookie 这个 2 小时过期是已经实现了,但第二个功能好像并没有实现

    我的问题是:
    1.如果我两个功能要求的过期时间一样,只配置 cookie 过期时间,能同时实现两个功能吗。
    2.如果是我现在要实现的这两个功能,我配置的问题出在哪里。

    8 条回复    2019-04-18 18:55:27 +08:00
    PressOne
        1
    PressOne  
       2018-05-02 09:42:32 +08:00
    第二个功能,要每次请求之后,通过 js 定时请求,才能判断是不是过期。每次新请求之后,刷新这个 js 定时器就可以了
    guiqiqi
        2
    guiqiqi  
       2018-05-02 09:48:44 +08:00 via iPhone
    没有用过 flask-login,但是自己写了一套基于 flask 的用户和权限系统,cookie 的有效时间可以在返回的 response 中使用 set_cookie 来设置,其中的第三个参数是有效时间;
    在你的问题里面,如果两个时间相同,配置这个就足够了(例如将过期时间配置成 2h );
    如果非要让用户在 1h 之内没有任何操作就要登出的话我给你一个思路:加载完毕页面之后前端 setInterval(1h),给后端发一个登出的 ajax 请求,后段返回的请求带上作废 cookie 的请求给浏览器,ajax 完了之后弹个框通知用户已被登出。
    当然这只是一个思路,希望能帮到你。
    mzmxcvbn
        3
    mzmxcvbn  
    OP
       2018-05-02 10:02:07 +08:00
    @guiqiqi 谢谢回复,我想问一下 session.permanent =True
    app.permanent_session_lifetime = timedelta(hours=1)这几个配置是在什么情况下用到的呢
    guiqiqi
        4
    guiqiqi  
       2018-05-02 18:48:37 +08:00 via iPhone
    @mzmxcvbn #3
    官方文档中就有说明:启用 permanent 之后 session lifetime 才会被应用,否则 session 在浏览器关闭时过期(在浏览器端就是 cookies 过期);
    建议多看官方文档。
    mzmxcvbn
        5
    mzmxcvbn  
    OP
       2018-05-03 11:16:39 +08:00
    @guiqiqi 我设置了呀 session.permanent = True
    lfzyx
        6
    lfzyx  
       2018-10-20 13:50:59 +08:00
    第二个功能,如果是为了安全,那你用 js 完全没有意义,通过修改 js 发送的数据,就可以骗过服务端。
    正确的做法是用户每次点击 url 后,都在数据库的用户表里更新时间戳,这样下一次点击 url 就可以对比了
    polar9527
        7
    polar9527  
       2019-04-18 18:53:32 +08:00
    我的理解是这两个功能有冲突,当你这样配置好后,在第二个功能中 1 个小时后虽然“ session ”这个 cookie 失效了,但是,flask_login 还是会从名叫“ remember_token ”的 cookie 中将用户登录信息重新载入到名叫“ session ”的 cookie 中。具体源码可以看一下 flask_login.login_manager._load_user 这个函数
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3662 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 10:33 PVG 18:33 LAX 03:33 JFK 06:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86