python中django 判断用户唯一在线 ,登录状态 的语法糖——装饰器心得

这里先介绍一下啥是语法糖:语法糖指那些没有给计算机语言添加新功能,而只是对人类来说更“甜蜜”的语法。语法糖往往给程序员提供了更实用的编码方式,有益于更好的编码风格,更易读。在python中 装饰器就是 一种语法糖,听着很甜蜜,用着更好使。

在介绍一下装饰器:装饰器是Python语言中的高级语法。主要的功能是对一个函数、方法、或者类进行加工,作用是为已经存在的对象添加额外的功能,提升代码的可读性。装饰器是设计模式的一种,其本质上是一个Python函数,装饰器的返回值也是一个函数对象.(ps:这里不会详细的讲解装饰器的,只说一下本人会用到基础所以提一点基础)

通俗点说就是在不改变原有函数的前提下,增加一些功能,而且装饰器还多次使用,下面举个栗子给大家简单介绍一下装饰器的使用:大致意思就是先调用 引入下面的那个函数add2为log的func,然后在内部函数fn里添加功能,在返回add2,在返回fn(建议看下计算机是怎样跑起来的,就能很容易的明白函数的运行与嵌套运行了,那本书不厚,但是很有用,这里就不细说了)

def log(f):
    def fn(*a):#可变参数能够适配,方法参数列表中的个数
        print type(a)#输出类型
        return f(*a)
    return  fn
@log
def add2(n):
    return reduce(lambda x,y:x+y,[x for x in range(1,n+1)])

print  add2(5)

不管读者看没看懂,今天不是来将装饰器的,所以直接进入重点,

django中使用自定义的装饰器来判断用户唯一在线和回话是否到期,实现的原理很简单

第一种方法:在用户登录后,在数据库添加一个唯一的request.session["hert"]=hash(time.time())只要是能标识出唯一就行,同时放到会话中,每进行一次操作就会比对数据库的值与会话中的值是否一致,如果有的二个人登录此账号或者在别的地方登录此账号一进行操作,先登录的人一进行操作就会被挤下来,这个是发生操作的情况下,下面的装饰器直接放在每个函数上即可。

def the_one(func):
    '''自定义 验唯一证在线 装饰器'''
    def check_login_status(request):
        if request.session.get('qq', None):
            try:
                hert = request.session.get('hert', None)
data=models.Users.objects.filter(qq=request.session.get('qq',None)).values('business_card').first()
                if str(hert) == str(data['business_card']):
                    return func(request)
                else:
                    return redirect('/login/')
            except:
                return redirect('/login/')
        else:
            return redirect('/login/')
    return check_login_status

第二种方法就是ajax的短轮询,不明白轮询也没事就是ajax加了一个定时器,很简单,下面这就是前台代码

$(function callbackFun() {
    $.ajax({
        url: "/is_thatone/",#后台函数的url
        type: "GET",   #请求方式随意,与后台对应即可
        dataType: "json",  #数据类型大多数json即可,也有例外的这里不多说
       #成功时执行的回调函数
        success: function (j) {
            if (j.code === 0) {
                alert("下线提示", "您的账号在其他地方登录,若非本人操作,请重新登录。");
                window.location.href = '/login/';
            } else {
                callbackFun();
                setTimeout(callbackFun, 1000); //延时递归调用自己,间隔调用时间,单位毫秒这里是每过一秒向后台发送一次请求
            }
        }
    });
});

后台相对来说和第一种一样,只不过返回的参数不同而已,

def is_thatone(request):
    if request.session.get('qq',None):
        try:
            hert = request.session.get('hert',None)
            data=models.Users.objects.filter(qq=request.session.get('qq',None)).values('business_card').first()
            if str(hert) == str(data['business_card']):
                return JsonResponse({'code':1})
            else:
                return JsonResponse({'code': 0})
        except Exception as e:
            # print e
            return JsonResponse({'code': 0})
    else:
        return redirect('/login/')

本人也是新手,有交流的可以加wx:l15373097872,说明来意,特别感谢大家指出问题,共同进步,人生苦短,我选python。

猜你喜欢

转载自blog.csdn.net/qq_42735170/article/details/82225771