V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Leon6868
V2EX  ›  反馈

v2ex 的页面缓存有点不人性化

  •  
  •   Leon6868 · 2020-07-21 20:54:28 +08:00 · 1969 次点击
    这是一个创建于 1571 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Google Chrome 83.0.4103.116 (正式版本) ( 64 位)
    举个例子:从主页前往签到页面并签到,页面显示签到成功,但按下返回键回到主页后,签到信息不会更新。
    消息提示功能也有类似的问题

    第 1 条附言  ·  2020-07-21 22:03:38 +08:00

    是我没说清楚。cache-control设置为no-cache, no-store。


    复现:

    from flask import Flask
    app = Flask(__name__)
    
    
    @app.route('/')
    def index():
        doc = """<h1>{} times</h1>
        <ul>
        <li><a href="/uncache1"> cache-control: no-cache, no-store</a></li>
        <li><a href="/uncache2"> cache-control: max-age=0</a></li>
        <li><a href="/log">log</a></li>
        </ul>"""
        return doc.format(str(time))
    
    @app.route('/log')
    def logger():
        global time
        doc = """<h1>{} times</h1>
        <h2>Please turn back</h2>"""
        time += 1
        return doc.format(time)
    
    @app.route('/uncache1')
    def uncache1():
        doc = """<h1>{} times</h1>
        <ul>
        <li><a href="/">cache-control: unset</a></li>
        <li><a href="/log">log</a></li>
        </ul>"""
        return doc.format(str(time)), [("cache-control", "no-cache, no-store")]
    
    @app.route('/uncache2')
    def uncache2():
        doc = """<h1>{} times</h1>
        <ul>
        <li><a href="/">cache-control: unset</a></li>
        <li><a href="/log">log</a></li>
        </ul>"""
        return doc.format(str(time)), [("cache-control", "max-age=0")]
    
    if __name__ == '__main__':
        time = 0
        app.run(port=80,host="0.0.0.0")
    

    够清楚了吧?

    Leon6868
        1
    Leon6868  
    OP
       2020-07-21 20:58:13 +08:00
    @Livid 是否可以通过给主页添加“Cache-Control”的 header 来解决?
    Girlphobia
        2
    Girlphobia  
       2020-07-21 21:13:28 +08:00 via Android
    @Leon6868 根据 HTML Living Standard,浏览器会保存页面的 browsing context 与 session history,在访问历史的时候会读取之前页面的状态,与 HTTP 缓存无关。
    如果这是一个需要解决的问题,做法应该是页面检测到返回时刷新,或者对签到之类的信息使用一个单独的前端模块发送 XHR 请求,并且在前端更新。
    wxsm
        3
    wxsm  
       2020-07-21 21:15:22 +08:00 via iPhone
    问这个问题说明你并不理解浏览器是如何缓存的。建议自己先弄明白再 at 别人。
    Licsber
        4
    Licsber  
       2020-07-21 21:32:06 +08:00
    "但按下返回键回到主页后" 好了 本帖不用看了
    推荐 lz 一个解决方案:下次按下左上角“V2EX”logo 返回
    缺点嘛 就是会多一些网络请求 但是既然你认为不更新是 bug 的话 那就多一次呗
    jugelizi
        5
    jugelizi  
       2020-07-21 21:33:40 +08:00 via iPhone
    手动问号 你真的理解浏览器的行为?
    arischow
        6
    arischow  
       2020-07-21 21:34:50 +08:00 via iPhone
    你吓到我了
    Leon6868
        7
    Leon6868  
    OP
       2020-07-21 22:05:07 +08:00
    @wxsm
    @Girlphobia
    是我没说清楚。cache-control 设置为 no-cache, no-store 。当然直接点击 logo 也是一个解决方法
    Leon6868
        8
    Leon6868  
    OP
       2020-07-21 22:05:46 +08:00
    @Licsber 我没说是 bug,我说有点不人性化(毕竟键盘 alt+←也很爽)
    mercury233
        9
    mercury233  
       2020-07-21 22:08:51 +08:00
    后退就要重新载入才是真的不人性化吧
    Leon6868
        10
    Leon6868  
    OP
       2020-07-21 22:14:08 +08:00
    @mercury233 设置里再添加一个开关(手动滑稽)
    Licsber
        11
    Licsber  
       2020-07-22 00:48:53 +08:00
    @Leon6868 #8
    @mercury233 #9 同意 9 楼观点
    如果一个网页连后退也要刷新的话 假设你网络状态不好怎么办 其次 给服务器( CDN 多带来多少压力
    另外 常见的使用场景 难道不是主页点着 从上点灰到下 刷完一遍之后刷新主页重新把亮的点灰么(
    假设这个主页是无缓存的 你会丢失浏览状态 并且 一个强制实时更新的主页更加不容易寻找内容
    autoxbc
        12
    autoxbc  
       2020-07-22 11:44:43 +08:00
    其实大家都是用脚本签到的

    油猴写的半自动方案,访问主页时后台签到,仅仅免去点击,也不算违规
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1614 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:00 · PVG 01:00 · LAX 09:00 · JFK 12:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.