django 賬號登陸踢人(中間件)

django使用1.9之前版本 1.11中間件使用的裝飾器(閉包)的形式,登陸信息保存在django緩存中,session保存在MySQL數據庫

# coding=utf-8
from django.core.cache import cache
from django.contrib.sessions.models import Session


class OnlyOne_User_Login(object):
    def process_request(self, request):
        user_id = request.user.id
        session_key = request.session.session_key
        delete_session(user_id, session_key)
        return None

    def process_response(self, request, response):
        user_id = request.user.id
        session_key = request.session.session_key
        res = set_cache(user_id, session_key)
        return response


def delete_session(user_id, session_key):
    """
    刪除原來登陸用戶的session
    :param user_id:
    :param session_key:
    :return:
    """
    if user_id is None:
        return
    cache_session_key = cache.get(user_id)
    if cache_session_key == session_key or cache_session_key is None:
        return
    session = Session.objects.filter(session_key=cache_session_key).first()
    if session:
        session.delete()
        session.save()
        cache.delete(user_id)
    return


def set_cache(user_id, session_key):
    """
    如果值存儲,則返回False,否則返回True。
    :param user_id:
    :param session_key:
    :return:
    """
    cache_session_key = cache.get(user_id)
    # print(cache.get(user_id), 'q')
    if cache_session_key:
        return
    res = cache.set(user_id, session_key, 30 * 60)
    # print(cache.get(user_id), 'hou')
    return res

 

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