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

猜你喜欢

转载自blog.csdn.net/weixin_42368421/article/details/88670540