防止同一個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)