session用法及api限速裝飾器

# 只要是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
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章