防止同一个session多次提交某任务
此处的url提交后,会处理30s。
当第一次提交session时,会延迟30s然后返回数据:
当在30s内,同样的session输入了此url:
302重定向,将其重定向到sessionsafetest中。
此例子原理是这样的:
在session存入一条user_info的数据
Flask会默认把session数据放到客户端的cookie中:
新增RequestManager类,将这个数据记录下来。在服务器处理结束后,移除这个数据。
在请求之前,如果发现RequestManager类中有这个session数据了,就让其重定向到其他页面。
相关代码如下:
class RequestManager:
currentUser = set()
@staticmethod
def add(user):
RequestManager.currentUser.add(user)
@staticmethod
def remove(user):
RequestManager.currentUser.remove(user)
@staticmethod
def isSessionExist(user):
for item in RequestManager.currentUser:
if item == user:
return True
return False
@staticmethod
def printAll():
print(RequestManager.currentUser)
拦截器相关的:
@app.after_request
def after_request(response):
if request.path == "/sessionsafetest":
return response
user = session.get('user_info')
try:
RequestManager.remove(user)
except Exception as e:
traceback.print_exc()
print(RequestManager.printAll())
return response
#做个实验,某个任务要处理30s
@app.route("/task30s", methods=['GET'])
def goTask():
time.sleep(30)
result = {
"msg" : "success"
}
return jsonify(result)
@app.route("/sessionsafetest", methods=['GET'])
def getSeesionSafePage():
result = {
"msg" : "session is running"
}
return jsonify(result)