BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #6277同步于 2015/4/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

在flask中如何避免持续的刷新请求

runner56
2015/4/14镜像同步5 回复
使用flask做了个查询系统。由于查询个结果需要大约3秒,如何避免客户端在这3秒内持续的刷新请求?本想着使用session来做判断的,可是发现session是线程安全的,只要没有返回结果,session中的内容都是一致的,因此无果。
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
STKLOSE机器人#1 · 2015/4/14
session 的理解扩宽, 将其保存到 redis 服务中(就一个单进程) 客户端 cookie 保存 sessionid, 每次请求 server 端读取到 sessionid, 然后通过 sessionid 为 key, 从 redis get 出数据, 如果不是想要的状态, 此次请求就做其他处理. 而另一边查询3秒那块线程返回后将 session 状态更新到 redis 中. 有一个疑惑, 为啥查询要3秒.....
runner56机器人#2 · 2015/4/14
谢谢回答!因为进行的是全库搜索,所以时间有点长。我也试着把获取请求的时间存入session,用redis来保存session值,通过客户端返回的sessionid来获取。本想着获取到请求时,通过时间间隔来判断是否请求过于频繁,但是发现只要在查询期间,同一个客户端请求获取的session值是不变的,也就是第二次请求得到的session值并不会因为第一次修改了而变化。。 【 在 STKLOSE 的大作中提到: 】 : session 的理解扩宽, 将其保存到 redis 服务中(就一个单进程) : 客户端 cookie 保存 sessionid, : 每次请求 server 端读取到 sessionid, 然后通过 sessionid 为 key, : ...................
colorest机器人#3 · 2015/4/14
加个缓存,先给查询提速一下?
buptmuye机器人#4 · 2015/4/15
sf说的思路很对,来到请求就看sessionid是否在redis中,如果在则不处理,如果不在则作为key加入redis,同时处理请求。设置退化时间3秒
STKLOSE机器人#5 · 2015/4/18
我明白你的场景了, 也许符合你的场景: 1. 同样是 sessionid 为 key session 关于用户的信息存储在原来你的结构中, 再增加一个 key 是针对该业务请求的, 仍然是 sessionid 为 key, sessionid 只是 key 的后缀, eg: # 对应的 value 只是用来做用户有效验证的等等. SESSION:$sessionid # 针对库搜索的业务, 额外增加一个状态存储, 但和原session概念分开. FULL_DB_SEARCH:$sessionid 时效性为预估搜索时间的 1.5倍到2倍. 第一次请求时, 设置该key, value 是 第一次请求的 timestamp 该请求查询过程中, 有其他请求时(同个sessionid), 查询该key的timestamp 做比较. 第一次请求查询结果返回后, delete 该 key. 【 在 runner56 的大作中提到: 】 : 谢谢回答!因为进行的是全库搜索,所以时间有点长。我也试着把获取请求的时间存入session,用redis来保存session值,通过客户端返回的sessionid来获取。本想着获取到请求时,通过时间间隔来判断是否请求过于频繁,但是发现只要在查询期间,同一个客户端请求获取的session值是不变的,也就是第二次请求得到的session值并不会因为第一次修改了而变化。。