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
 

你可能感兴趣的:(编程语言,#,python学习)