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 · 6918 次点击
    这是一个创建于 2157 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在要实现两个功能:
    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   ·   我们的愿景   ·   实用小工具   ·   2169 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:13 · PVG 00:13 · LAX 09:13 · JFK 12:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.