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

使用 twisted 写一个服务器, 如何区分浏览器的刷新和关闭操作?

  •  
  •   JhOOOn · 2016-05-26 11:45:20 +08:00 · 2292 次点击
    这是一个创建于 3132 天前的主题,其中的信息可能已经有所发展或是发生改变。

    实现的方式类似这样:

    from twisted.web import server, resource
    from twisted.internet import reactor, endpoints
    
    class Counter(resource.Resource):
        isLeaf = True
        numberRequests = 0
    
        def render_GET(self, request):
            self.numberRequests += 1
            request.setHeader(b"content-type", b"text/plain")
            content = u"I am request #{}\n".format(self.numberRequests)
            return content.encode("ascii")
    
    endpoints.serverFromString(reactor, "tcp:8080").listen(server.Site(Counter()))
    reactor.run()
    

    每次请求会模拟一个长连接,满足条件在返回。目前在使用这种方式统一处理浏览器刷新或关闭(目前发现刷新时有时不会触发):

    request._disconnected
    

    因需求变了, 刷新和关闭需要分别对待,那么 twisted 支持这种机制吗? 谢谢

    4 条回复    2016-05-26 13:23:48 +08:00
    pimin
        1
    pimin  
       2016-05-26 11:50:59 +08:00 via Android
    浏览器动作不应该是前端去考虑,用 js 处理嘛?
    JhOOOn
        2
    JhOOOn  
    OP
       2016-05-26 11:58:13 +08:00
    @pimin 当收到一个请求时,我会模拟一个长连接,满足条件在返回。在 twisted 里,目前我的理解是,当发生刷新或者关闭时, twisted 会自动触发该条件: request._disconnected 。
    JhOOOn
        3
    JhOOOn  
    OP
       2016-05-26 11:59:55 +08:00
    @pimin 经过你的提醒,我想到了不用 twisted 的机制,改为前端判断,来传递相应的结果,服务器在处理响应的结果,应该也可以,待验证。
    sujin190
        4
    sujin190  
       2016-05-26 13:23:48 +08:00
    现代浏览器处理网络不是每个页面单独打开的,应该是按域名共享的,页面在使用完连接只是返回连接池了,一定时间之后才会关闭吧,你关闭页面也好、刷新页面也好,和连接是否断开有什么关系呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   833 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:18 · PVG 05:18 · LAX 13:18 · JFK 16:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.