# 只要是client相同,那sessionid就相同。比如在同一臺PC上面用postman進行get/post操作。
sessionid = request.session.session_key
不同的client端,session就不同,sessionid也不同。session長度爲32位字符。
sessionid=87aq6b2neizdavuscgurtnly8mlisnfh
sessionid=5gwf5qidv2ein2ggu9l7rl8z3axqf9wd
不能用session來緩存用戶數據,當用戶數據發生變化時,可能導致不同的手機/web呈現不同的數據。
if request.method == 'POST':
request.session[SESSION_FRIEND_KEY[1][0] + user_id] = info_data
logging.info("sessionid={},update session[info{}]={}".format(sessionid, user_id, info_data))
else:
info_data = request.session.get(SESSION_FRIEND_KEY[1][0] + user_id)
logging.info("sessionid={},get session[info{}]={}".format(sessionid, user_id, info_data))
當api限制訪問速度時,是針對某個用戶而言的,這時可以用session來處理。
def stat_api_call(api_tick_us=500):
"""
127.0.0.1:6379[2]> select 0
OK
127.0.0.1:6379> keys *
1) "/mVer"
2) "token"
127.0.0.1:6379> hget "/mVer" "all"
"{\"counts\": 5, \"fastest_time(us)\": 403113}"
127.0.0.1:6379>
:param api_tick_us:
:return:
api 限速是針對某user而言(client)而言,不是針對全部user。因此用session保存時間信息,而不是redis。
"""
def inner1(func):
def inner2(request, *args, **kwargs):
f_url = request.get_full_path()
# logging.info("f_url={}".format(f_url))
last_call_time = request.session.get(f_url)
call_time = time.time()
if not last_call_time:
request.session[f_url] = call_time
return func(request, *args, **kwargs)
else:
request.session[f_url] = call_time
api_interval_time = (call_time - last_call_time) * 1000000.0
stat_data = CacheUtils.get_api_stat(f_url)
if not stat_data:
counts = 1
fastest_time = int(api_interval_time)
else:
counts = stat_data["counts"] + 1
fastest_time = stat_data["fastest_time(us)"]
if int(api_interval_time) < fastest_time:
fastest_time = int(api_interval_time)
stat_data = {
"counts": counts,
"fastest_time(us)": fastest_time
}
CacheUtils.set_api_stat(f_url, stat_data)
if api_interval_time > api_tick_us:
# logging.info("api={} ,interval time={} ms".
# format(f_url, str(round(api_interval_time/1000.0, 3))))
return func(request, *args, **kwargs)
else:
logging.info("api={} too fast. interval time={} ms".
format(f_url, str(round(api_interval_time/1000.0, 3))))
return HttpJsonResponse(result={'success': False, 'error_code': ErrorCode.ERR_API_TOO_FAST})
return inner2
return inner1